如何在RSpecmock/stub中使用不同的参数值?
How to use different parameter values in an RSpec mock/stub?
我的程序从网上下载一个 zip 文件,然后对其进行解析。相关解析相关代码为:
Zip::File.open("real_file.zip") do |zip_file|
# do stuff
end
在我的 RSpec 测试环境中,我想将此代码存根以解析 fake/mock 文件而不是真实文件。具体来说,我想将参数值 "real_file.zip" 替换为 "mock_file.zip".
我尝试了以下方法:
allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip"))
...但这会阻止块内代码的执行(# do stuff
)。我不希望通过该方法 返回 模拟文件内容,而是将其分配给 zip_file
的值以供进一步使用。如何实现?
这是您想要执行的操作:
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
我的程序从网上下载一个 zip 文件,然后对其进行解析。相关解析相关代码为:
Zip::File.open("real_file.zip") do |zip_file|
# do stuff
end
在我的 RSpec 测试环境中,我想将此代码存根以解析 fake/mock 文件而不是真实文件。具体来说,我想将参数值 "real_file.zip" 替换为 "mock_file.zip".
我尝试了以下方法:
allow(Zip::File).to receive(:open).and_return(Zip::File.open("mock_file.zip"))
...但这会阻止块内代码的执行(# do stuff
)。我不希望通过该方法 返回 模拟文件内容,而是将其分配给 zip_file
的值以供进一步使用。如何实现?
这是您想要执行的操作:
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