即使控制器工作正常,我也无法完成其中一项测试。
所以,我有一个表单来更改用户的VIP状态。
<%= form_tag("/activate/#{@user.id}", method: :get, class: "form-inline space-bottom") do |f| %>
<%= hidden_field_tag :vip, false %>
<%= check_box_tag :vip, type:"checkbox" %>
<%= date_field_tag(:vip_expiration_date, @user.vip_expiration_date) %>
<button type="submit">
Change
</button>
此表单发送到此路线:
get '/activate/:id', to: 'users#activate_vip'
并进入此控制器操作:
def activate_vip
@user = User.find(params[:id])
if @user.update_attributes(activate_vip_params)
flash[:success] = "VIP status updated"
redirect_to @user
else
render show
end
end
也:
def activate_vip_params
params.permit(:vip_expiration_date, :vip)
end
这个动作很好,没问题,所以我想用minitest做一个测试:
test "Admin should be able to change vip status" do
log_in_as(@user)
get "/activate/#{@other_user.id}", params: {:vip => true}
assert @other_user.vip
end
我确信这个测试只会通过,但我收到错误“预期错误是真的。”
我的直觉说这与我如何传递参数有关,所以我在params上尝试了几种变体:但都没有成功。有人可以帮我这个吗?
我正在使用gem'minitest','〜&gt; 5.10','!= 5.10.2'和轨道5
编辑:
更改了代码,以便我可以“要求”用户。
<%= form_for @user, url: "/activate/#{@user.id}", class: "form-inline" do |f| %>
<%= hidden_field_tag :vip, false %>
<%= f.check_box :vip, type:"checkbox" %>
<%= f.date_field :vip_expiration_date %>
<%= f.submit "Change" %>
<% end %>
和控制器
def activate_vip_params
params.require(:user).permit(:vip_expiration_date, :vip)
end
和测试:
test "Admin should be able to change vip status" do
log_in_as(@user)
patch "/activate/#{@other_user.id}", user: { vip: true }
assert @other_user.vip
end
仍然没有成功。控制器工作但无法进行测试。
------编辑------
没关系。这是一个愚蠢的错误。
我只需在夹具中添加“vip:false”,以便@other_user初始化变量。
答案 0 :(得分:1)
您不必使用'params',您需要编写允许的参数名称。对于控制器中的ex
def address_params
params.require(:address).permit(:street_address_1)
end
然后在测试用例中你可以做
test "Admin should be able to change vip status" do
log_in_as(@user)
get "/activate/#{@other_user.id}", address: { street_address_1: "1223 4th floor"}
assert @other_user.vip
end
答案 1 :(得分:1)
这是一个简单的错误。
一切都确实正确,但@another_user
的固定需要vip: false
状态,因此可以初始化变量。