ruby-on-rails - 使用 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
我在用着:
- 红宝石 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
解决方案
您不需要创建lm_params
. 应该匹配器将为您模拟 params 对象。
如果您只需要测试您可以执行的权限should permit(:name).for(:create)
如果您需要检查允许参数的值:should permit(:name).for(:create, params: {name: 'John'})
strong_parameters_matcher.rb的文档中有很好的示例
编辑:另一个很好的文档来源是rubydoc for shoulda matchers。
推荐阅读
- reactjs - 在 API 调用上的 onSubmit 和异步操作的 react-redux 问题
- amazon-web-services - 使用 AWS .Net SDK 时,客户端对象的生命周期应该是什么?
- android - 如何使最后一个项目一直滚动到 RecyclerView 的顶部
- python - 使用多个(行、列)对索引 pandas 数据帧
- c++ - Win32窗体边框加粗
- angular - 搜索后角度过滤器不返回完整列表
- selenium - 在 msedgedriver.exe 上永久关闭 w3c
- django - 将 Django modelForm 外键字段更改为文本字段
- reactjs - jsx 中的元素道具
- reactjs - 这个组件在没有解构的情况下会是什么样子?