Подтвердить что ты не робот

Значение для атрибутов для тестирования FactoryGirl и Rspec

Просматривая учебное пособие по тестированию контроллера, автор дает пример теста rspec, проверяющего действие контроллера. Мой вопрос: почему они использовали метод attributes_for over build? Нет четкого объяснения, почему используется attributes_for, кроме того, что он возвращает хэш значений.

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

Ссылка на учебное пособие находится здесь: http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html Пример находится в начале раздела темы Controller testing basics

4b9b3361

Ответ 1

attributes_for вернет хеш, тогда как build вернет объект, который не сохраняется.

Учитывая следующее factory:

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

Вот результат build:

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

и результат attributes_for

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

Я нахожу attributes_for очень полезным для моего функционального теста, так как для создания пользователя я могу сделать что-то вроде следующего:

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

При использовании build нам нужно вручную создать хэш атрибутов из экземпляра user и передать его методу post, например:

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

Обычно я использую build и create, когда мне непосредственно нужны объекты, а не хеш атрибутов

Сообщите мне, если вам нужна дополнительная информация