最小的请求与params

时间:2017-06-08 05:18:03

标签: ruby-on-rails-5 minitest

即使控制器工作正常,我也无法完成其中一项测试。

所以,我有一个表单来更改用户的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初始化变量。

2 个答案:

答案 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状态,因此可以初始化变量。

相关问题