【问题标题】:How to use different parameter values in an RSpec mock/stub?如何在 RSpec 模拟/存根中使用不同的参数值?
【发布时间】:2016-12-31 08:16:23
【问题描述】:

我的程序从网上下载一个 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)。我不希望该方法返回 模拟文件内容,而是将其分配给zip_file 的值以供进一步使用。如何实现?

【问题讨论】:

标签: rspec mocking zip rspec-rails stubbing


【解决方案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

【讨论】:

  • 成功!我之前遇到过这种策略,但不知道如何翻译文档示例以适合我自己的应用程序。谢谢@mroach
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
相关资源
最近更新 更多