You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Minitest::Mock验证带yield块的Faraday.post请求参数?

使用Minitest Mock测试带块的Faraday调用

你要测试的MyClass.my_method里,Faraday.post通过块来配置请求参数,这种场景需要同时Mock请求对象和post方法,才能捕获块内的操作细节。

具体实现步骤如下:

  1. Mock请求对象:创建Minitest::Mock模拟Faraday的请求实例,用来验证块内对req.headers和req.body的赋值操作。
  2. Mock Faraday.post方法:让Mock的post方法接收URL和块,执行块时传入我们Mock的请求对象,同时验证URL是否正确。
  3. 执行测试并验证:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 00:42:16