首页 > 解决方案 > 使用 shoulda_matchers 测试强参数

问题描述

我很难弄清楚如何使用 rspec 和 shoulda_matchers 测试强参数。

无论我尝试过什么,我总是收到以下信息:RSpec::Expectations::ExpectationNotMetError: Expected POST #create to restrict parameters on :language_name to :name, but it did not restrict any parameters.

这是我的控制器:

class LanguageNamesController < CrudController
  inherit_resources
  actions :all, :except => [:show]

  private
    def language_name_params
      params.require(:language_name).permit(:name)
    end
end

这是测试:

require 'rails_helper'
RSpec.describe LanguageNamesController, type: :controller do
  describe "parameters" do
    it do
     lm_params = {
       language_name: {
         name: 'John'
       }
     }
     expect(subject).to permit(:name).for(:create, params: { params: lm_params }).on(:language_name)
    end
  end
end

另外,我试过这个并得到相同的结果:

it do
  subject.params = ActionController::Parameters.new(language_name: {foo: 'bar', name: 'baz'})
  expect(subject).to permit(:name).for(:create).on(:language_name)
end

如果我这样尝试,我得到ArgumentError: unknown keyword: language_name

it do
 lm_params = {
   language_name: {
     name: 'John'
   }
 }
 expect(subject).to permit(:name).for(:create, params: lm_params).on(:language_name)
end

我在用着:

有谁知道如何解决这个问题?

谢谢!


这是我测试它的解决方法:

it do
  faker_name = Faker::Name.name

  params = {
    language_name: {name: faker_name, other_attribute: "other value"},
    extra: {extra: 1}
  }
  get :index, params: params

  expect(subject.send(:language_name_params)).to eq({"name"=> faker_name})
end

标签: ruby-on-railsrspecstrong-parameters

解决方案


您不需要创建lm_params. 应该匹配器将为您模拟 params 对象。

如果您只需要测试您可以执行的权限should permit(:name).for(:create)

如果您需要检查允许参数的值:should permit(:name).for(:create, params: {name: 'John'})

strong_parameters_matcher.rb的文档中有很好的示例

编辑:另一个很好的文档来源是ruby​​doc for shoulda matchers


推荐阅读