#ruby-on-rails-3 #automated-tests
#ruby-on-rails-3 #автоматизированные тесты
Вопрос:
У меня есть приложение Rails3, в котором есть рабочие процессы, и у них много рабочих назначений. В рабочих назначениях есть поле work_sent_date, дата отправки работы пользователю. На экране редактирования рабочего процесса я отображаю поле даты отправки работы, но рабочий процесс не имеет атрибута work_sent_date. Если у каких-либо рабочих заданий есть дата, я показываю самое последнее, и его нельзя редактировать. Если все они пусты, я отображаю текстовое поле, которое можно редактировать, и в WorkflowController#update, если эта дата заполнена, поле work_sent_date рабочих заданий получает эту дату.
Это работает, когда я тестирую его вручную. Полагаю, я мог бы просто создать для него атрибут, но я стараюсь быть аккуратным и не иметь избыточных данных.
Я пытаюсь написать тест для этого. Сначала я утверждаю, что WorkAssignment#work_sent_date является пустым для всех рабочих назначений. Затем я пытаюсь «опубликовать: обновить» и не могу понять, как передать значение work_sent_date, которое является полем формы, но не атрибутом. То, что я хочу сделать, это что-то вроде.
test "setting work_sent_date in wf sets it in wa" do
@workflow.work_assignments.each do |wa|
assert wa.work_sent_date.blank?
end
get :edit, :id => @workflow.id
assert_response :success
post :update, :workflow => @workflow.attributes, :parameters => {'work_sent_date' => Date.today.to_s}
@workflow.work_assignments.each do |wa|
assert_equal(wa.work_sent_date, Date.today)
end
end
Но это поле параметров не работает. Ошибок нет, но я продолжаю получать сбои, потому что wa.work_sent_date по-прежнему равен нулю, поэтому он передается неправильно. Как мне передать сегодняшнюю дату в качестве дополнительного параметра?
(Или, может быть, есть лучший способ сделать все это, который я бы с удовольствием рассмотрел.)
Я знаю, что это сложно. Надеюсь, я хорошо это объяснил. Любые предложения будут оценены. Я погуглил до смерти и ничего не могу найти.
Комментарии:
1. Могу ли я предложить вам изучить RSpec с помощью Capybara? Больше информации в этих скринкастах: railscasts.com/episodes /… и railscasts.com/episodes/275-how-i-test?autoplay=true
Ответ №1:
Нашел мою проблему. Неправильный синтаксис. Вот что это должно быть. Это работает.
put :update, :id => @workflow.id, :workflow => @workflow.attributes, :work_sent_date => Date.today.to_s
Комментарии:
1. Спасибо, это именно то, что я только что искал.
2. Отлично, рад, что это помогло, так как я получил так много хорошей помощи и информации на этом сайте.
Ответ №2:
Вы также можете реорганизовать создание и редактирование следующим образом:
protected
def edit_workflow(workflow, options = {})
post :update, :id => workflow.id, :workflow => workflow.attributes.merge(options)
end
def create_workflow(options = {})
post :create, :workflow => {}.merge(options)
end
end