В нашем тесте 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]
ничего не возвращает и не является правильным способом получения данных из параметров.