首页 > 解决方案 > 在 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.

我想创建规范以确保我的参数传递了正确的选项。我想避免制定完整的请求规范,但我想检查nameparam 是否有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"}哈希。如何测试并确保我的自定义验证器用于给定参数?

提前感谢您的帮助。

标签: ruby-on-railsrubygrapegrape-api

解决方案


我建议不要从测试中深入研究实现细节——如果有一天你决定用其他东西替换葡萄(或者葡萄本身发布一个新的不兼容版本)——你的测试将在你需要它们的时候变得无用最多。

此外,测试是否存在positive_value: true并不能保证您的验证器实际使用预期参数调用并正常工作,因此至少添加:

expect_any_instance_of(PositiveValue).to receive(:validate_param!).with('id', {'id'=>123, 'name'=>'name'}).and_call_original

最好的方法是编写一个实际的请求规范。如果您担心,您可以删除繁重的处理部分,但让您的控制器实际处理参数并返回一些错误,就像在生产中发生此错误一样。


推荐阅读