Initiation Rails Rspec
-
Upload
cyril-mougel -
Category
Technology
-
view
2.206 -
download
1
Transcript of Initiation Rails Rspec
Ruby On Rails par Rspec
Ruby On Rails par Rspec
Cyril Mougel
30 Decembre 2008
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 ?
Ruby On Rails par Rspec
Rspec, BDD ?
Behaviour Driven Development
Methode Agile
Extreme programming
TDD (Test Driven Development)
l’empire du ’should’
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 ?
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
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)
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
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 ?
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
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
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
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
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
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 ?
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
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
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
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
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 ?
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
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
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 ?
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>
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
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 ?
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
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
Ruby On Rails par Rspec
les mocks ?
Question ?