我有一个非常简单的葡萄驱动API。假设它看起来像这样:
class MyApi < Grape::API
params do
requires :name, type: String
requires :id, type: Integer, positive_value: true
end
get '/' do
# whatever...
end
end
我有自定义的PositiveValue验证器,它对id
很好。
我想创建规范,以确保我的参数有正确的选项通过。我想避免制作完整的请求规范,但我想检查name
参数是否有type: String
,并确保它是必需的:
# my_api_spec.rb
describe 'params' do
let(:params) { described_class.new.router.map['GET'].first.options[:params] }
specify do
expect(params['name']).to include(type: 'String') # this one works fine
expect(params['id']].to include(type: 'Integer', positive_value: true) # this one fails
end
end
事实证明,这个参数具有{:required=>true, :type=>"Integer"}
散列。我如何测试并确保我的自定义验证器用于给定的参数?
感谢您提前提供帮助。
我建议不要从测试中深入研究实现细节——如果有一天你决定用其他东西取代grape(或者grape本身发布了一个新的不兼容版本(——那么在你最需要它们的时候,你的测试将变得毫无用处。
另外,测试positive_value: true
的存在并不能保证您的验证器能够使用预期的参数进行实际调用并正确工作,所以至少要添加:
expect_any_instance_of(PositiveValue).to receive(:validate_param!).with('id', {'id'=>123, 'name'=>'name'}).and_call_original
最好的方法是编写一个实际的请求规范。如果你担心的话,你可以去掉繁重的处理部件,但让你的控制器实际处理参数并返回一些错误,就像在生产中发生这种错误一样。