在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
相关产品推荐
相关产品推荐

