Transcript

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 ?

top related