如何在RSpec模拟/存根中使用不同的参数值?

时间:2016-12-31 08:16:23

标签: rspec mocking zip rspec-rails stubbing

我的程序从网上下载一个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的值以供进一步使用。如何实现这一目标?

1 个答案:

答案 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