RAILS3: задать параметры запроса для публикации в функциональных тестах?

#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