2012-10-31 10 views
28

Guardando attraverso un tutorial sul test del controller, l'autore fornisce un esempio di un test rspec che verifica un'azione del controllore. La mia domanda è: perché hanno usato il metodo attributes_for su build? Non c'è una chiara spiegazione del perché attributes_for sia usato oltre a restituire un hash di valori.Significato per attributes_for in Test FactoryGirl e Rspec

it "redirects to the home page upon save" do 
    post :create, contact: Factory.attributes_for(:contact) 
    response.should redirect_to root_url 
end 

Il collegamento tutorial è trovato qui: http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html L'esempio si trova nella sezione argomento che inizia Controller testing basics

risposta

54

attributes_for restituirà un hash, mentre build restituirà un non persisteva oggetto.

Dato il seguente fabbrica:

FactoryGirl.define do 
    factory :user do 
    name 'John Doe' 
    end 
end 

Ecco il risultato di build:

FactoryGirl.build :user 
=> #<User id: nil, name: "John Doe", created_at: nil, updated_at: nil> 

e il risultato di attributes_for

FactoryGirl.attributes_for :user 
=> {:name=>"John Doe"} 

trovo attributes_for molto utile per il mio funzionale test, in quanto posso fare cose come la seguente t o creare un utente:

post :create, user: FactoryGirl.attributes_for(:user) 

Quando si utilizza build, avremmo dovuto creare manualmente un hash di attributi dall'istanza user e passarlo al metodo post, come ad esempio:

u = FactoryGirl.build :user 
post :create, user: u.attributes # This is actually different as it includes all the attributes, in that case updated_at & created_at 

solito utilizzare build & create quando voglio direttamente gli oggetti e non un attributo hash

Fatemi sapere se avete bisogno di più dettagli

+0

Grazie pjam, lo capisco ora! Stai diventando sempre più un mentore rspec per me in overstackflow. – jason328

+0

cercavo questa risposta dappertutto. Un segno però ... come potrei aggirare 'post: create, user: u.attributes' se alcuni di quegli attributi non sono accessibili nel modello? –

+0

Non sono sicuro di aver capito cosa vuoi, intendi se alcuni attributi non sono nella lista attr_accessible? Quindi non vedo quale sia il problema, potrei mancare qualcosa qui – pjam

Problemi correlati