【问题标题】:Testing strong parameters with shoulda_matchers使用 shoulda_matchers 测试强参数
【发布时间】:2018-12-21 04:40:45
【问题描述】:

我很难弄清楚如何使用 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

我正在使用:

  • 红宝石 2.5.1
  • 导轨 5.1.6
  • 应该匹配器 3.1.2

有人知道怎么解决吗?

谢谢!


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

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

【问题讨论】:

  • 或者还有其他方法可以测试强参数?
  • 如果将language_name_params 移至公共方法会怎样?
  • @Vasilisa Per the Rails documentation “最好的做法是降低不打算作为操作的方法(私有或受保护)的可见性,例如辅助方法或过滤器”

标签: ruby-on-rails rspec strong-parameters


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 不错!它使用以下语法工作:expect permit(:name).for(:create).on(:language_name) 虽然现在测试通过了,但 simplecov 仍然抱怨没有测试强参数方法(language_name_params)。你知道吗?谢谢!
  • Simplecov 没有将方法识别为已测试,因为我们正在测试参数而不是方法本身。我将对控制器操作之一进行测试(例如:创建),并在该测试中写出对langauge_name_params 应该是什么的期望。我还在答案中添加了更多文档,这些文档更类似于您使用的语法。
猜你喜欢
  • 2017-07-22
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多