使用rspec测试多个对象更新表单

时间:2014-12-17 17:04:22

标签: ruby-on-rails rspec capybara automated-tests

我有以下方法可以在一个表单中一次更新多个对象:

def update_by_day
  company_calendars = CompanyCalendar.find(params[:company_calendars_ids])
  company_calendars.each do |company_calendar|
    unless update_calendar_params(company_calendar, params["company_calendar_" + company_calendar.id.to_s])
      render js: "alert('Start time must be smaller then End time');"
      break
    end
  end
end

def update_calendar_params(company_calendar, calendar_params)
  company_calendar.time_from = company_calendar.time_from.change(:hour => calendar_params["time_from(4i)"], :min => calendar_params["time_from(5i)"])
  company_calendar.time_to = company_calendar.time_to.change(:hour => calendar_params["time_to(4i)"], :min => calendar_params["time_to(5i)"])
  company_calendar.save
end

表单将对象ID保存在隐藏字段上:

<%= form_for(:company_calendar, url: {action: "update_by_day"}, method: :put, remote: true) do |f| %>    
  <% company_calendars.each do |company_calendar| %>
    <%= hidden_field_tag "company_calendars_ids[]", company_calendar.id%>

不是最优雅的代码,但工作正常。

现在我在编写测试时遇到了问题。这是我到目前为止所得到的:

it "updates all calendars from correspondent day" do
    company_calendar = FactoryGirl.create(:company_calendar, company_id: @company.id )
    put :update_by_day, {:day => company_calendar.day, company_id: @company.to_param, :company_calendar => { time_from: "2014-09-25 08:00:00", time_to: "2014-09-25 12:00:00" }, :format => :js  }
    expect(company_calendar.time_from).to eq( "2014-09-25 08:00:00" )
end

抛出以下错误:

Couldn't find CompanyCalendar without an ID

路由不使用id:

/companies/:company_id/company_calendars/update_by_day(.:format)

所以我不知道如何传递论据。

好的,我会感激任何帮助。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

您需要在company_calender_id的规范中传递params,因为您将其传递到隐藏字段并使用它在update_by_day操作的第一行中查找记录。 尝试下面的一个:

put :update_by_day, {:day => company_calendar.day, company_id: @company.to_param, :company_calendar => { time_from: "2014-09-25 08:00:00", time_to: "2014-09-25 12:00:00" },:company_calendars_ids => company_calendar.id, :format => :js  }