RSpec - 测试强参数

14

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

这是我的设置示例:

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方法,以确保它正确地过滤恶意键/值对,但是我不知道该怎么做。是否有其他人经历过这种情况?

3个回答

17

你可以将params哈希表桩起来

params = ActionController::Parameters.new(your_hash)

这是您的控制器中URL参数转换为的类,它提供了要求和允许方法。

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


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

0

我不确定是否需要测试strong_parameters,我猜想你是通过这个gem来使用它的。

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

这是“测试Rails”的一个例子,我认为这是不必要的。我不会测试attr_accessible是否按照广告所说的那样工作(测试Rails),或者attr_accessor(测试Ruby)。

在我看来,你的集成测试应该涵盖所有所需的成功/失败实例,并隐含地涵盖你的strong_parameter配置。


3
我们的测试策略是明确地为所有功能编写测试,以便我们在未来可能更换宝石/自行开发后仍能知道系统是否正常运行。 - Bryce
10
您也可以测试与strong_parameters集成的代码是否正常工作。我有一些根据用户角色/权限可写/不可写的字段,因此需要测试这两个部分是否正确集成。 - cpuguy83
1
将应用程序从Rails 1.1升级到3.2(现在准备升级到4.0),我可以向您保证测试Rails非常必要。在一个版本的Rails中以某种方式工作的东西可能会在另一个版本中改变行为。例如,我曾经使用clone方法克隆activerecord记录,但在3.0和3.2之间的某个地方,他们决定dup将提供相同的功能...并且稍微有所不同。这没有得到很好的宣传,但很快被我的测试发现了。 - sockmonk
是的,@sockmonk - 这绝对是你想要测试Rails的情况之一 :) - adarsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接