如何用Minitest::Mock验证带yield块的Faraday.post请求参数?
使用Minitest Mock测试带块的Faraday调用
你要测试的MyClass.my_method里,Faraday.post通过块来配置请求参数,这种场景需要同时Mock请求对象和post方法,才能捕获块内的操作细节。
具体实现步骤如下:
- Mock请求对象:创建
Minitest::Mock模拟Faraday的请求实例,用来验证块内对req.headers和req.body的赋值操作。 - Mock Faraday.post方法:让Mock的post方法接收URL和块,执行块时传入我们Mock的请求对象,同时验证URL是否正确。
- 执行测试并验证:在stub块内调用目标方法,最后确认所有Mock的预期都被触发。
完整测试代码:
require 'minitest/autorun' require 'faraday' class MyClass def self.my_method Faraday.post('https://example.com') do |req| req.headers['Content-Type'] = 'application/json' req.body = '{}' end end end class MyClassTest < Minitest::Test def test_my_method_with_block # 1. Mock请求对象,验证headers和body的设置 mock_request = Minitest::Mock.new mock_request.expect(:headers=, {'Content-Type' => 'application/json'}, [{'Content-Type' => 'application/json'}]) mock_request.expect(:body=, '{}', ['{}']) # 2. Mock Faraday.post方法,接收URL和块,执行块并传入mock_request mock_post = Minitest::Mock.new mock_post.expect(:call, nil, ['https://example.com']) do |url, &block| block.call(mock_request) end # 3. Stub Faraday.post并执行目标方法 Faraday.stub :post, mock_post do MyClass.my_method end # 验证所有mock的预期都已满足 mock_request.verify mock_post.verify end end
代码说明
mock_request通过expect分别验证headers=和body=的调用参数,确保块内设置的内容符合预期。mock_post的call方法不仅验证传入的URL,还会执行传入的块,把mock_request传给块,触发块内对请求对象的操作。- 最后调用
verify方法,确认所有Mock的预期都被正确触发,没有遗漏或错误的调用。
内容的提问来源于stack exchange,提问作者LondonAppDev
相关产品推荐
相关产品推荐

