В чем разница между Factory.build и Factory.attributes_for? - PullRequest
2 голосов
/ 26 января 2012

В нашем тесте rspec для приложения rails 3.1.0 мы используем как Factory.build, так и Factory.attributes_for.Мы обнаружили, что, если мы изменим Factory.build на Factory.attributes_for, один случай проверки данных потерпит неудачу.Кроме того, Factory.attributes_for не проверял это правильно.Мне интересно, в чем разница между этими двумя и как их использовать в rspec.

В нашем модельном тесте мы используем Factory.build.В тесте контроллера для обновления или нового мы используем Factory.attributes_for.мы только что обнаружили в тесте контроллера случай, когда Factory.attributes_for не проверил его правильно, и потерпел неудачу в случае, который прошел проверку модели с помощью Factory.build.

Большое спасибо.

ОБНОВЛЕНИЕ: Вот случай rspec в модели rfq:

  it "should not have nil in report_language if need_report is true" do
    rfq = Factory.build(:rfq, :need_report => true, :report_language => nil)
    rfq.should_not be_valid
  end

Вот случай rspec в контроллере rfq:

it "should be successful for corp head" do
  session[:corp_head] = true
  session[:user_id] = 1
  s = Factory(:standard)
  rfq = Factory.attributes_for(:rfq, :need_report => true, :report_language => 'EN')
  rfq[:standard_ids] = [s.id] # attach standard_id's to mimic the POST'ed form data
  get 'create', :rfq => rfq
  response.should redirect_to URI.escape("/view_handler?index=0&msg=RFQ saved!")  
end

В случае с вышеприведенным контроллером произошел сбой из-за ошибки проверки.Ошибка в случае контроллера вызвана добавлением строки ниже для создания rfqs контроллера.

  @rfq.report_language = nil unless params[:need_report]

Однако случай в модели rfq (см. Выше для модели rfq) прошел успешно.Это .build в тесте модели и .attributes_for в тесте контроллера.

ОБНОВЛЕНИЕ:

Правильное утверждение должно быть:

@rfq.report_language = nil unless params[:rfq][:need_report] == 'true'

ИЛИ

@rfq.report_language = nil if params[:rfq][:need_report] == 'false'

params[:need_report] ничего не возвращает и не является правильным способом получения данных из параметров.

1 Ответ

6 голосов
/ 26 января 2012

Factory.attributes_for просто возвращает хэш атрибутов для Factory. Factory.build, использует те же активы, но возвращает экземпляр вашего класса с такими же установленными атрибутами.

Factory.build(:user)

функционально эквивалентно

User.new(Factory.attributes_for(:user))

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

...