ruby-on-rails - 在 ruby 葡萄 API 的参数中测试自定义验证器的存在
问题描述
我有一个非常简单的葡萄驱动 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
param 是否有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"}
哈希。如何测试并确保我的自定义验证器用于给定参数?
提前感谢您的帮助。
解决方案
我建议不要从测试中深入研究实现细节——如果有一天你决定用其他东西替换葡萄(或者葡萄本身发布一个新的不兼容版本)——你的测试将在你需要它们的时候变得无用最多。
此外,测试是否存在positive_value: true
并不能保证您的验证器实际使用预期参数调用并正常工作,因此至少添加:
expect_any_instance_of(PositiveValue).to receive(:validate_param!).with('id', {'id'=>123, 'name'=>'name'}).and_call_original
最好的方法是编写一个实际的请求规范。如果您担心,您可以删除繁重的处理部分,但让您的控制器实际处理参数并返回一些错误,就像在生产中发生此错误一样。
推荐阅读
- python - 覆盖属性
- c++ - C++ 是否用函数调用替换内置运算符?
- r - Azure Functions 中的 RDotNet (R.NET) 问题
- php - PHP-比较foreach循环中的相似度得分
- github - Google Cloud Functions:Github 发布的项目布局
- javascript - 如何在 Google 表格中合并行
- ios - 为什么在重新启动应用程序或执行两次 NSBatchDeleteRequest 之前不会删除条目?
- javascript - 我可以使用节点/套接字广播particle.js 背景和交互吗?
- sql - SQL Server:多个 WHERE NOT EXISTS 子句
- angular - 无法使用 RouterTestingModule 测试路由