Тестирование пользовательских валидаторов на наличие в параметрах в ruby grape API - PullRequest
0 голосов
/ 10 марта 2020

У меня очень простой 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.

Я хотел бы создать spe c, который гарантирует что у моих параметров есть правильные параметры. Я бы не хотел делать полные спецификации запросов, но вместо этого я хотел бы проверить, имеет ли 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"} га sh. Как я могу проверить и убедиться, что мои пользовательские валидаторы используются для данного параметра?

Спасибо за помощь заранее.

1 Ответ

0 голосов
/ 10 марта 2020

Я бы посоветовал не вдаваться в детали реализации тестов - если однажды вы решите заменить виноград чем-то другим (или сам виноград выпустит новую несовместимую версию), ваши тесты станут бесполезными в то время, когда они вам больше всего нужны.

Кроме того, проверка на наличие positive_value: true не гарантирует, что ваш валидатор действительно вызывается с ожидаемыми параметрами и работает правильно, поэтому по крайней мере добавьте:

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

Best способ написать актуальный запрос spe c. Вы можете заглушить тяжелые обрабатывающие детали, если вы беспокоитесь об этом, но заставьте свой контроллер фактически обработать параметры и вернуть некоторую ошибку, как если бы эта ошибка произошла в производственном процессе.

...