存根 rspec and_raise 并添加一条消息

Posted

技术标签:

【中文标题】存根 rspec and_raise 并添加一条消息【英文标题】:Stubbing rspec and_raise and adding a message 【发布时间】:2015-01-07 14:39:04 【问题描述】:

我正在编写需要在我的代码中测试救援的测试。

型号代码:

rescue Coinbase::Error => e
  #debugger
  if e == "You don't have that many bitcoins in your account to sell."
  ...
end

Rspec 代码:

allow_any_instance_of(Order).to receive(:sell).and_raise(Coinbase::Error, "You don't have that many bitcoins in your account to sell.")

在我做的地方添加调试器并在控制台中查看e 的值,我明白了

#<Coinbase::UnauthorizedError: Coinbase::UnauthorizedError>

所以消息没有被传入。

在过去的 40 分钟里,我一直在谷歌上搜索,我发现的所有内容都只涉及发送错误类,而不是消息。大概有一些错误类别相同但消息不同的情况。

任何建议都会很棒。谢谢!

【问题讨论】:

【参考方案1】:

在拯救自定义错误类的情况下,包可能不符合标准 Ruby 错误接口。

通常,传递给错误的第一个参数是消息,但在不是来自标准库的错误中,情况可能并非如此。

Ferrum gem 经常这样做。例如,当它引发 Ferrum::BrowserError 时,第一个参数是一个自定义响应哈希,其中包含一个“消息”参数,因此将其存根类似于:

allow(ferrum_node).to receive(:focus).and_raise(
  Ferrum::BrowserError.new( "message" => "Element is not focusable" )
)

【讨论】:

【参考方案2】:

我认为你想做:Coinbase::Error.new("You don't have that many bitcoins in your account to sell.") 在 raise 调用中。

更新,我认为您还想要e.message == "" 而不是e == "",因为您将错误与字符串而不是错误消息进行比较。

【讨论】:

打开控制台并尝试运行 Coinbase::Error.new("你的账户中没有那么多比特币可以出售。"),会发生什么? 效果很好。 allow_any_instance_of(Order).to receive(:sell).and_raise(Coinbase::Error.new("You don't have that many bitcoins in your account to sell.")) 不是出于某种奇怪的原因。当我将调试器放在上面时,我无法让e 显示消息,我得到了我之前提到的错误 尝试我添加的更新,进行这两项更改,看看它们是否有效 刚刚做了。测试中的e.message 给我"Coinbase::UnauthorizedError"e 的完整打印输出是#<Coinbase::UnauthorizedError: Coinbase::UnauthorizedError> 所以在控制台尝试做e =Coinbase::Error.new("You don't have that many bitcoins in your account to sell." 然后e.message 你应该得到你正在寻找的消息。还有 e 打印在做什么?

以上是关于存根 rspec and_raise 并添加一条消息的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 rspec 存根辅助方法

Rspec 模拟和存根与期望混淆

有没有办法用 Rspec 存根包含模块的方法?

如何在RSpec中存根?

RSpec 存根方法可以按顺序返回不同的值吗?

在 rspec 中为 API 规范存根protect_from_forgery