Сухая заглушка :: Матчеры в Rails/RSpec

Мы используем Dry :: Monads с Dry :: Matchers в нашем приложении. В основном мы используем монадические результаты на уровне контроллера, используя синтаксис case Dry::Matchers, например:

      ....call(foo: bar) do |result|
 result.success { |resource| render json: resource, status 200 }
 result.failure { |error| render json: error, status: 422 }
end

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

Бывают случаи, когда мы хотели бы использовать приведенный выше синтаксис блока для обработки монадического ответа на промежуточном этапе нашего рабочего процесса, поэтому мы хотели бы заглушить / имитировать вышеуказанное resultно не заглушить блок. Единственный способ, которым мы добились успеха:

      let(:validator) do
  instance_spy(Validator, call: validator_response).tap do |spy|
    spy.singleton_class.include Dry::Matcher.for(:call, with: Dry::Matcher::ResultMatcher)
  end
end
let(:validator_response) { Success(...) } # or Failure(...)

Однако это похоже на очень жестокого шпиона. Кто-нибудь сталкивался с этим вариантом использования? Это вообще плохая идея? Альтернативой может быть обработка монадического ответа с помощью оператора case, который работает так же хорошо, но не так приятно смотреть.

0 ответов

Другие вопросы по тегам