【发布时间】: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