我的程序从网上下载一个zip文件然后解析它。相关的解析相关代码是:
Zip::File.open("real_file.zip") do |zip_file|
# do stuff
end
在我的RSpec测试环境中,我希望将此代码存根以解析伪/模拟文件而不是真实文件。具体来说,我想替换参数值" real_file.zip"用" mock_file.zip"。
我尝试了以下方法:
allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip"))
...但是这可以防止在块(# do stuff
)内执行代码。我不希望该方法将模拟文件内容返回,但rahter要分配给zip_file
的值以供进一步使用。如何实现这一目标?
答案 0 :(得分:1)
这是你想要做的:
mock_file = Zip::File.open('mock_file.zip')
allow(Zip::File).to receive(:open) { |&block| block.call(mock_file) }
您在这里做的是在原始代码中为块生成一个值。简单地返回标量值的问题在于它不会对块产生任何影响,因此不会调用它。 注意我在放入消息期望之前打开模拟文件,因为它也会拦截你对Zip::File.open
的调用并导致堆栈溢出。
更多信息:https://www.relishapp.com/rspec/rspec-mocks/v/3-2/docs/configuring-responses/block-implementation#yield-to-the-caller's-block