存根 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 并添加一条消息的主要内容,如果未能解决你的问题,请参考以下文章