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

在RSpec中如何mock块参数并验证块内方法的调用参数

解决方案

核心思路是构造一个模拟的SFTP实例,提前设置upload!方法的调用预期,再在捕获到Net::SFTP.start的块之后,将模拟实例传入块执行,即可验证块内方法的调用参数。

兼容现有写法的扩展版本

# 构造模拟SFTP对象,定义upload!方法的调用预期
mock_sftp = double
expect(mock_sftp).to receive(:upload!).with('/local', '/remote')

expect(Net::SFTP).
  to receive(:start) do |host, username, keyword_args, &block|
    expect(host).to eq("testhost.com")
    expect(username).to eq("test_user")
    expect(keyword_args).to eq(keys: ["key"])
    # 主动执行业务代码传入的块,传入模拟SFTP实例
    block.call(mock_sftp)
  end

注意:你原有测试中keyword_args的预期是keys: ["test_key"],和实际调用的参数不一致,可根据业务实际情况调整。

更简洁的RSpec原生写法

可以直接用with校验入参、and_yield自动传参给块,不需要手动写块内入参校验逻辑:

mock_sftp = double
expect(mock_sftp).to receive(:upload!).with('/local', '/remote')

expect(Net::SFTP).to receive(:start)
  .with('testhost.com', 'test_user', keys: ['key'])
  .and_yield(mock_sftp)

内容的提问来源于stack exchange,提问作者Marco Prins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:03