使用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
]
}
如果你想用自己的答案来解决问题,我认为你可以创建一个答案,然后接受它。