如何在rspec和rails 3的控制器规范中传递复选框集合值?



使用rails 3和rspec。我在视图中有一个这样的表单…

<%= form_for current_account, { :url => admins_account_path(current_account), :method => 'put' } do %>
  <div class="action">
    <%= submit_tag "Save" %>
  </div>
  <table>
    <tbody>
      <% @accountships.each do |accountship| %>
        <tr>
          <td><%= check_box_tag "accountship_ids[]", accountship.id, accountship.admin? %></td>
          <td><%= accountship.user.name %>
        </tr>
      <% end %>
    </tbody>
  </table>
<% end %>

在控制器中,我使用帐户#update_admin中的这个方法处理PUT。

@account.assign_administrators params[:accountship_ids]

我的问题是如何在rspec中构造参数来测试控制器动作。到目前为止,我所做的努力都不起作用。这是我最近的一次尝试,但没有成功。

before(:each) do
  # code that generates the ids, I know this is working from other tests ..
  .
  .
  .
  @attr = {
    :accountship_ids => [
      @admin_accountship.id,
      @not_admin_accountship.id,
      @signed_in_user_accountship.id
    ]
  }
end
it "should assign admin to users in the list" do
  # what should I be passing in as @attr?
  put :update_admins, :id => @account, :accountship_ids => @attr  
  Accountship.find(@admin_accountship.id).admin.should be_true
  Accountship.find(@owner_accountship.id).admin.should be_true
  Accountship.find(@not_admin_accountship.id).admin.should_not be_true
end

我所编写的所有需要表单复选框集合的值的测试都失败了,很明显,whatever_accountship。当rspec测试发布数据时,Admin属性没有被更新。

提前感谢!

编辑

我偶然发现了解决办法。数组不应该被包装在散列中,并且数组文字中的值需要首先转换为字符串,如下所示。
 @attr = [
   @admin_accountship.id.to_s,
   @not_admin_accountship.id.to_s,
   @signed_in_user_accountship.id.to_s
 ]

有人明白为什么他们需要字符串,而我有其他测试可以接受一个成熟的对象(不需要字符串)?

还有,既然我知道答案了,我该怎么处理我的问题?

看起来您正在将params哈希分配给实例变量,然后使用第一个哈希作为值创建一个新的哈希,并在put语句中传递整个混乱,当您需要做的只是传递原始参数时。或者换句话说:

put :update_admins, :id => @account.id, @attr

编辑

对不起,漫长的一天。参数需要在操作之后进入单个散列,因此:

put :update_admins, {:id=>@account.id}.merge(@attr)

编辑2

如果在数组中传递字符串,散列语法将工作:

@attr = {
  :accountship_ids => [
    @admin_accountship.id.to_s,
    @not_admin_accountship.id.to_s,
    @signed_in_user_accountship.id.to_s
  ]
}

如果你想用自己的答案来解决问题,我认为你可以创建一个答案,然后接受它。

相关内容

  • 没有找到相关文章

最新更新