Ruby Rspec 对捕获的异常的消息期望
Posted
技术标签:
【中文标题】Ruby Rspec 对捕获的异常的消息期望【英文标题】:Ruby Rspec message expectations for a caught exception 【发布时间】:2014-02-28 00:22:46 【问题描述】:Rspec 有没有办法为捕获的异常设置期望?我想验证是否引发了 MyException,但由于我正在捕获异常,Rspec 似乎并不知道它曾经发生过。
begin
if success
do good stuff
else
raise MyException.new()
end
rescue MyException => e
clean up
end
我尝试了一些类似以下的方法,但均未成功。 MyException.should_receive(:new)
和
Kernel.should_receive(:raise).with(MyException)
【问题讨论】:
【参考方案1】:您可以测试救援块的行为而不是检查异常:
class Test
def my_method
if success
# do good stuff
else
raise MyException.new()
end
rescue MyException => e
clean_up
end
end
describe Test do
it "should clean up when unsuccessful" do
subject.stub(:success) false
subject.should_receive(:clean_up)
subject.my_method
end
end
【讨论】:
【参考方案2】:我想出了如何做我需要的事情。
class MyClass
def my_method
begin
if success
do good stuff
else
raise MyException.new
end
rescue MyException => e
# clean up
end
end
end
describe MyClass do
it "Expects caught exception" do
my_instance = MyClass.new()
my_instance.should_receive(:raise).with(any_instance_of(MyException))
my_instance.my_method()
end
end
感谢您的其他建议。
【讨论】:
【参考方案3】:我会这样做:
RSpec.describe "matching error message with string" do
it "matches the error message" do
expect raise StandardError, 'this message exactly'.
to raise_error('this message exactly')
end
end
从Rspec
Documentation逐字复制
【讨论】:
如果你没有捕捉到异常,你会这样做,但我正在捕捉它。我想验证异常是否被引发,然后被捕获。 @Preffect 存根引发异常的方法/动作作为针对该异常的测试以上是关于Ruby Rspec 对捕获的异常的消息期望的主要内容,如果未能解决你的问题,请参考以下文章
如何在对引发异常的 C# webmethod 的 ajax 调用上指定消息?
ruby 具有期望语法的Rspec Rails备忘单(包括capybara匹配器)
ruby 扩展RSpec :: Matchers :: BuiltIn :: Match的自定义匹配器也可以指定捕获组。