RSpec - 测试强参数

Bry*_*yce 13 rspec ruby-on-rails ruby-on-rails-3 strong-parameters

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
Run Code Online (Sandbox Code Playgroud)

我想测试该user_params方法,以确保它正确地过滤掉恶意键/值对,但无法弄清楚如何做到这一点.还有其他人经历过这个吗?

cpu*_*y83 15

您可以将params哈希存根为

params = ActionController::Parameters.new(your_hash)
Run Code Online (Sandbox Code Playgroud)

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

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


ind*_*ndb 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)