2012-10-31 16 views
28

Przeglądając samouczek dotyczący testowania kontrolera autor podaje przykład testu rspec testującego działanie kontrolera. Moje pytanie brzmi: dlaczego użyli metody attributes_for przez build? Nie ma jednoznacznego wyjaśnienia, dlaczego użyto attributes_for, ponieważ zwraca on skrót wartości.Znaczenie atrybutów_do w testach FactoryGirl i Rspec

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

Link poradnik znajduje się tutaj: http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html Przykład znajduje się w początkowej części tematu Controller testing basics

Odpowiedz

54

attributes_for powróci hash, natomiast build powróci non utrzymywał obiekt.

Biorąc pod uwagę następujące fabryki:

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

Oto wynik build:

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

a wynik attributes_for

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

znajdę attributes_for bardzo pomocne dla mojej funkcjonalne test, ponieważ mogę zrobić rzeczy takie jak następujące t o utworzyć użytkownika:

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

Przy użyciu build, chcemy utworzyć ręcznie mieszania atrybutów na przykład user i przekazać je do sposobu post, takich jak:

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 

Zazwyczaj używać build & create gdy bezpośrednio chcą obiektów, a nie atrybuty hash

Daj mi znać, jeśli potrzebujesz więcej szczegółów

+0

Dzięki pjam, rozumiem to teraz! Stajesz się coraz bardziej mentorem rspec dla mnie w nadmiernym przepływie. – jason328

+0

szukałem tej odpowiedzi wszędzie. Jeden thign jednak ... jak poradziłbym sobie z 'post: create, user: u.attributes', jeśli niektóre z tych atrybutów nie są dostępne w modelu? –

+0

Nie jestem pewien, czy rozumiem, co chcesz, masz na myśli, jeśli niektóre atrybuty nie są na liście attr_accessible? Wtedy nie widzę, co to jest problem, może brakuje mi czegoś tutaj – pjam

Powiązane problemy