14

strong_parameters在我的控制器中使用 gem,但我很难理解如何测试它。

这是我的设置示例

class UserController < ActionController::Base
  include ActiveModel::ForbiddenAttributesProtection

  def create
    @user = User.new(user_params)
    if @user.save
      ...
    end
  end

  private
  def user_params
    params.require(:user).permit(:first_name, :last_name, :username, :email)
  end
end

我想测试该user_params方法以确保它正确过滤掉恶意键/值对,但不知道该怎么做。有没有其他人经历过这个?

4

3 回答 3

17

您可以将参数哈希存根为

params = ActionController::Parameters.new(your_hash)

这是您的 URL 参数在控制器中转换为的类,它为您提供了 require 和 permit 方法。

我个人将功能提取到一个新类中来处理授权策略。

于 2013-05-15T23:38:12.267 回答
6

根据您的需要修改它,

describe "create action" do
    it 'creates a user' do
      User.should_receive(:create).
        with({name: 'Alan D'}.with_indifferent_access)
      post :create, user:
        { first_name: 'Alan', last_name: 'Donald', username: 'alan77', email: 'mymail@yopmail.com' }
    end
end

或此问题的其他替代解决方案是:

describe UsersController::UserParams do
  it 'cleans the params' do
    params = ActionController::Parameters.new(user: {foo: 'bar', name: 'baz'})
    user_params = UsersController::UserParams.build(params)
    expect(user_params).to eq({name: 'baz'}.with_indifferent_access)
  end
end
于 2016-02-20T09:26:36.843 回答
0

我不确定我会测试strong_parameters,我猜你正在通过gem使用它。

gem 有自己的测试,所以我们可以假设它按预期工作。

这是一个“测试 Rails”的例子,我认为这是不必要的。我不会attr_accessible像宣传的(Testing Rails)或attr_accessor(Testing Ruby)那样测试它。

恕我直言,您的集成测试应涵盖所有所需的成功/失败实例,并隐式涵盖您的strong_parameter配置。

于 2013-05-16T04:20:53.607 回答