Initiation Rails Rspec

28
Ruby On Rails par Rspec Ruby On Rails par Rspec Cyril Mougel 30 D´ ecembre 2008

Transcript of Initiation Rails Rspec

Page 1: Initiation Rails Rspec

Ruby On Rails par Rspec

Ruby On Rails par Rspec

Cyril Mougel

30 Decembre 2008

Page 2: Initiation Rails Rspec

Ruby On Rails par Rspec

Rspec, BDD ?

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 3: Initiation Rails Rspec

Ruby On Rails par Rspec

Rspec, BDD ?

Behaviour Driven Development

Methode Agile

Extreme programming

TDD (Test Driven Development)

l’empire du ’should’

Page 4: Initiation Rails Rspec

Ruby On Rails par Rspec

Rails est agile avant tout

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 5: Initiation Rails Rspec

Ruby On Rails par Rspec

Rails est agile avant tout

Test : :Unit de base dans Rails

Dossier test cree a chaque creation de projet Rails

Stats de nombre du LOC et LOC de test

Possibilite de tester chaque couche de Rails

Page 6: Initiation Rails Rspec

Ruby On Rails par Rspec

Rails est agile avant tout

Mais pourquoi Rspec alors ?

Rspec == BDD Framework

Documentation generee plus claire que les Test : :Unit

Reutilisation plus simple du comportement

Ajout des Stories (Cucumber)

Page 7: Initiation Rails Rspec

Ruby On Rails par Rspec

Rails est agile avant tout

Et ca s’installe comment ?

gem install rspec && gem install rspec-rails

gem install rspec &&./script/install git ://github.com/dchelimsky/rspec-rails.git

gem install rspec &&git-submodule add vendor/plugins/rspec-railsgit ://github.com/dchelimsky/rspec-rails.git

Page 8: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche modele de Rails

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 9: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche modele de Rails

Des classes de Mapping a la Base de donnee

1 c l a s s User < A c t i v e R e c o r d : : Base2 has many : p r o d u c t s34 v a l i d a t e s p r e s e n c e o f : name5 v a l i d a t e s u n i q u e n e s s o f : name6 v a l i d a t e s f o r m a t o f : emai l ,7 : w i t h => /\A ( [ ˆ @\ s ]+)@( ( ? : [ − a−z0−9]+\.)+[ a−z ]{2 ,} )\Z/ i ,8 : on => : c r e a t e9 end

1011 c l a s s Product < A c t i v e R e c o r d : : Base12 b e l o n g s t o : u s e r13 end

Page 10: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche modele de Rails

Doit creer les accesseurs sur les colonnes

1 d e s c r i b e User do23 b e f o r e ( : each ) do4 @user = User . f i r s t5 end67 i t ’ s h o u l d a c c e s s to name ’ do8 @user . name . s h o u l d n o t b e n i l9 end

1011 end

Page 11: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche modele de Rails

Doit valider le model

1 d e s c r i b e User do2 d e s c r i b e ’ c r e a t e ’ do3 def u s e r v a l i d ( o p t i o n s )4 User . new ({ : name => ’ C y r i l Mougel ’ ,5 : e m a i l => ’ c y r i l . mougel@gmai l . com ’ } . merge ( o p t i o n s ) )6 end78 i t ’ s h o u l d u s e r v a l i d ’ do9 u s e r v a l i d . s h o u l d b e v a l i d

10 end1112 i t ’ s h o u l d p r e s e n c e o f name ’ do13 u s e r v a l i d ( : name => n i l ) . s h o u l d n o t b e v a l i d14 end1516 i t ’ s h o u l d u n i q name ’ do17 u s e r v a l i d . s a v e18 u s e r v a l i d . s h o u l d n o t b e v a l i d19 end2021 i t ’ s h o u l d not v a l i d w i t h bad e m a i l ’ do22 u s e r v a l i d ( : e m a i l => ’ c o o l ’ ) . s h o u l d n o t b e v a l i d23 end24 end25 end

Page 12: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche modele de Rails

Doit chercher des donnees

1 d e s c r i b e User do23 i t ’ s h o u l d f i n d by name ’ do4 User . f i n d b y n a m e ( ’ C y r i l Mougel ’ ) . s h o u l d == u s e r s ( : s h i n g a r a )5 end67 i t ’ s h o u l d f i n d by e m a i l ’ do8 User . f i n d b y e m a i l ( ’ c y r i l . mougel@gmai l . com ’ ) . s h o u l d == u s e r s ( : s h i n g a r a )9 end

1011 i t ’ s h o u l d f i n d by name and e m a i l ’ do12 User . f i n d b y n a m e a n d e m a i l ( ’ C y r i l Mougel ’ ,13 ’ c y r i l . mougel@gmai l . com ’ ) . s h o u l d == u s e r s ( : s h i n g a r a )14 end1516 i t ’ s h o u l d f i n d a l l ’ do17 User . a l l . s h o u l d == [ u s e r s ( : s h i n g a r a ) , u s e r s ( : u n d e r f l o w ) ]18 end19 end

Page 13: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche modele de Rails

Doit avoir des associations

1 d e s c r i b e User do2 b e f o r e : each do3 @user = u s e r s ( : s h i n g a r a )4 end56 i t ’ s h o u l d have 2 p r o d u c t s ’ do7 @user . s h o u l d have ( 2 ) . p r o d u c t s8 # @user . p r oduc t s . s i z e == 29 end

1011 i t ’ s h o u l d have book p r o d u c t s ’ do12 @user . p r o d u c t s [ 0 ] . s h o u l d == p r o d u c t s [ : book ]13 end14 end1516 d e s c r i b e Product do17 b e f o r e : each do18 @product = p r o d u c t s ( : book )19 end2021 i t ’ s h o u l d have u s e r s h i n g a r a ’ do22 @product . u s e r . s h o u l d == u s e r s ( : s h i n g a r a )23 end24 end

Page 14: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche controller de Rails

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 15: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche controller de Rails

Un controlleur Rails

1 c l a s s U s e r s C o n t r o l l e r < A p p l i c a t i o n C o n t r o l l e r23 def i n d e x4 @ u s e r s = User . f i n d ( : a l l )5 r e s p o n d t o do | fo rmat |6 format . html # index . html . e rb7 format . xml { r e n d e r : xml => @ u s e r s }8 end9 end

1011 def show12 @user = User . f i n d ( params [ : i d ] )13 r e s p o n d t o do | fo rmat |14 format . html # show . html . e rb15 format . xml { r e n d e r : xml => @user }16 end17 end1819 def c r e a t e20 @user = User . new ( params [ : u s e r ] )21 r e s p o n d t o do | fo rmat |22 i f @user . s a v e23 f l a s h [ : n o t i c e ] = ’ User was s u c c e s s f u l l y c r e a t e d . ’24 format . html { r e d i r e c t t o ( @user ) }25 e l s e26 format . html { r e n d e r : a c t i o n => ”new” }27 end28 end29 end30 end

Page 16: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche controller de Rails

Doit permettre de voir la liste des utilisateurs

1 d e s c r i b e U s e r s C o n t r o l l e r do23 d e s c r i b e ” r e s p o n d i n g to GET i n d e x ” do4 i t ” s h o u l d e x p o s e a l l u s e r s as @ u s e r s ” do5 g e t : i n d e x6 a s s i g n s [ : u s e r s ] . s h o u l d == [ u s e r s ( : s h i n g a r a ) ]7 end89 d e s c r i b e ” w i t h mime t y p e o f xml ” do

10 i t ” s h o u l d r e n d e r a l l u s e r s as xml ” do11 r e q u e s t . env [ ”HTTP ACCEPT” ] = ” a p p l i c a t i o n / xml ”12 g e t : i n d e x13 r e s p o n s e . body . s h o u l d == u s e r s ( : s h i n g a r a ) . t o x m l14 end15 end16 end17 end

Page 17: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche controller de Rails

Doit permettre de voir un utilisateur particulier

1 d e s c r i b e U s e r s C o n t r o l l e r do2 d e s c r i b e ” r e s p o n d i n g to GET show” do34 i t ” s h o u l d e x p o s e t h e r e q u e s t e d u s e r as @user ” do5 g e t : show , : i d => u s e r s ( : s h i n g a r a ) . i d6 a s s i g n s [ : u s e r ] . s h o u l d == u s e r s ( : s h i n g a r a )7 end89 d e s c r i b e ” w i t h mime t y p e o f xml ” do

1011 i t ” s h o u l d r e n d e r t h e r e q u e s t e d u s e r as xml ” do12 r e q u e s t . env [ ”HTTP ACCEPT” ] = ” a p p l i c a t i o n / xml ”13 g e t : show , : i d => u s e r s ( : s h i n g a r a ) . i d14 r e s p o n s e . body . s h o u l d == u s e r s ( : s h i n g a r a ) . t o x m l15 end16 end17 end18 end

Page 18: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche controller de Rails

Doit creer un utilisateur

1 d e s c r i b e U s e r s C o n t r o l l e r do2 d e s c r i b e ” r e s p o n d i n g to POST c r e a t e ” do34 d e s c r i b e ” w i t h v a l i d params ” do56 i t ” s h o u l d c r e a t e u s e r ” do7 a s s e r t d i f f e r e n c e ’ User . count ’ do8 p o s t : c r e a t e , : u s e r => { : name => ’ Jean−f r a n c o i s ’ ,9 : e m a i l => ’ j f @ r u b y f r a n c e . org ’}

10 r e s p o n s e . s h o u l d r e d i r e c t t o (11 u s e r u r l ( User . f i n d b y n a m e ( ’ Jean−f r a n c o i s ’ ) ) )12 end13 end1415 end1617 d e s c r i b e ” w i t h i n v a l i d params ” do1819 i t ” s h o u l d not c r e a t e u s e r ” do20 a s s e r t n o d i f f e r e n c e ’ User . count ’ do21 p o s t : c r e a t e , : u s e r => { : name => ’ Jean−f r a n c o i s ’ ,22 : e m a i l => ’ j f @ r u b y f r a n c e ’}23 r e s p o n s e . s h o u l d r e n d e r t e m p l a t e ( ’ new ’ )24 end25 end26 end2728 end29 end

Page 19: Initiation Rails Rspec

Ruby On Rails par Rspec

Les routes Rails

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 20: Initiation Rails Rspec

Ruby On Rails par Rspec

Les routes Rails

Une simple ligne de route

1 A c t i o n C o n t r o l l e r : : Rout ing : : Routes . draw do |map |2 map . r e s o u r c e s : u s e r s3 end

Page 21: Initiation Rails Rspec

Ruby On Rails par Rspec

Les routes Rails

Doit creer plein de routes

1 d e s c r i b e U s e r s C o n t r o l l e r do2 d e s c r i b e ” r o u t e g e n e r a t i o n ” do3 i t ” s h o u l d map #i n d e x ” do4 r o u t e f o r ( : c o n t r o l l e r => ” u s e r s ” ,5 : a c t i o n => ” i n d e x ” ) . s h o u l d == ”/ u s e r s ”6 end78 i t ” s h o u l d map #new” do9 r o u t e f o r ( : c o n t r o l l e r => ” u s e r s ” ,

10 : a c t i o n => ”new” ) . s h o u l d == ”/ u s e r s /new”11 end1213 i t ” s h o u l d map #show” do14 r o u t e f o r ( : c o n t r o l l e r => ” u s e r s ” ,15 : a c t i o n => ”show” , : i d => 1 ) . s h o u l d == ”/ u s e r s /1”16 end1718 i t ” s h o u l d map #e d i t ” do19 r o u t e f o r ( : c o n t r o l l e r => ” u s e r s ” ,20 : a c t i o n => ” e d i t ” , : i d => 1 ) . s h o u l d == ”/ u s e r s /1/ e d i t ”21 end2223 i t ” s h o u l d map #update ” do24 r o u t e f o r ( : c o n t r o l l e r => ” u s e r s ” ,25 : a c t i o n => ” update ” , : i d => 1 ) . s h o u l d == ”/ u s e r s /1”26 end2728 i t ” s h o u l d map #d e s t r o y ” do29 r o u t e f o r ( : c o n t r o l l e r => ” u s e r s ” ,30 : a c t i o n => ” d e s t r o y ” , : i d => 1 ) . s h o u l d == ”/ u s e r s /1”31 end32 end33 end

Page 22: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche Vue de Rails

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 23: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche Vue de Rails

Une vue d’index

1 <h1>L i s t i n g u s e r s</h1>23 <t a b l e>4 <t r>5 <th>Name</ th>6 <th>Email</ th>7 </ t r>89 <% f o r u s e r i n @ u s e r s %>

10 <t r>11 <td><%=h u s e r . name %></ td>12 <td><%=h u s e r . e m a i l %></ td>13 <td><%= l i n k t o ’ Show ’ , u s e r %></ td>14 <td><%= l i n k t o ’ E d i t ’ , e d i t u s e r p a t h ( u s e r ) %></ td>15 <td><%= l i n k t o ’ D e s t r o y ’ , u s e r , : c o n f i r m => ’ Are you s u r e ? ’ ,16 : method => : d e l e t e %></ td>17 </ t r>18 <% end %>19 </ t a b l e>

Page 24: Initiation Rails Rspec

Ruby On Rails par Rspec

La couche Vue de Rails

Doit permettre de voir les utilisateurs

1 d e s c r i b e ”/ u s e r s / i n d e x . html . e r b ” do2 i n c l u d e U s e r s H e l p e r34 b e f o r e ( : each ) do5 a s s i g n s [ : u s e r s ] = User . a l l6 #There a r e 2 u s e r s i n f i x t u r e s7 end89 i t ” s h o u l d r e n d e r l i s t o f u s e r s ” do

10 r e n d e r ”/ u s e r s / i n d e x . html . e r b ”11 r e s p o n s e . s h o u l d h a v e t a g ( ” t r>td ” , User . f i r s t . name )12 r e s p o n s e . s h o u l d h a v e t a g ( ” t r>td ” , User . f i r s t . e m a i l )13 end14 end

Page 25: Initiation Rails Rspec

Ruby On Rails par Rspec

les mocks ?

1 Rspec, BDD ?

2 Rails est agile avant tout

3 La couche modele de Rails

4 La couche controller de Rails

5 Les routes Rails

6 La couche Vue de Rails

7 les mocks ?

Page 26: Initiation Rails Rspec

Ruby On Rails par Rspec

les mocks ?

S’il te plait, dessine moi un mock ?

mock model(User)

Comportement d’un objet ActiveRecord sans access a la BDD

Possibilite de retourner ce que l’on veux

Evite de creer une fixture qui gere ce cas la

Page 27: Initiation Rails Rspec

Ruby On Rails par Rspec

les mocks ?

Doit s’utiliser dans les controllers

1 d e s c r i b e U s e r C o n t r o l l e r do2 d e s c r i b e ” r e s p o n d i n g to GET show” do3 b e f o r e : each do4 @user = mock model ( User )5 end67 i t ” s h o u l d e x p o s e t h e r e q u e s t e d u s e r as @user ” do8 User . s h o u l d r e c e i v e ( : f i n d ) . w i t h ( ”37” ) . a n d r e t u r n ( @user )9 g e t : show , : i d => ”37”

10 a s s i g n s [ : u s e r ] . s h o u l d e q u a l ( @user )11 end1213 d e s c r i b e ” w i t h mime t y p e o f xml ” do1415 i t ” s h o u l d r e n d e r t h e r e q u e s t e d u s e r as xml ” do16 r e q u e s t . env [ ”HTTP ACCEPT” ] = ” a p p l i c a t i o n / xml ”17 User . s h o u l d r e c e i v e ( : f i n d ) . w i t h ( ”37” ) . a n d r e t u r n ( @user )18 @user . s h o u l d r e c e i v e ( : t o x m l ) . a n d r e t u r n ( ” g e n e r a t e d XML” )19 g e t : show , : i d => ”37”20 r e s p o n s e . body . s h o u l d == ” g e n e r a t e d XML”21 end2223 end24 end25 end

Page 28: Initiation Rails Rspec

Ruby On Rails par Rspec

les mocks ?

Question ?