我们在我们的应用程序中使用 Dry::Monads 和 Dry::Matchers。我们主要使用 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 语句处理单子响应,该语句同样有效,但看起来不太好。