使用MINITEST规范,我可以测试代码中引发了一个特定的异常,如下所示:
proc { foo.do_bar }.must_raise SomeException
但是,我并不关心具体的异常是什么,我只是想确认一些则抛出异常。 如果我或其他开发者,决定改变什么异常是由富#do_bar扔了,我的测试不会有如果指定了预期的异常通常不足以改变。
也就是说,我想编写测试这种方式(例外是类SomeException的祖先):
proc { foo.do_bar }.must_raise Exception
通过这导致失败,当我运行测试:
[Exception] exception expected, not
Class: <SomeException>
我可以写我的MINITEST规格更一般地与问候例外?
(实际的原因,我想检查任何异常,而不是特定的例外情况是,我使用的是第三方的宝石,它是代码,引发异常。事实上,我的方法A得到由第三方叫方法B.甲引发MyException,然而乙捕捉该异常,并重新引发一个不同的异常。此异常具有相同的消息作为我的例外[和该消息是我应该在测试来验证],但不同的类。 )
describe 'testing' do
it 'must raise' do
a = Proc.new {oo.non_existant}
begin
a[]
rescue => e
end
e.must_be_kind_of Exception
end
end
无论如何,这应该做的非常接近你所要求的。
这似乎很奇怪的行为。
来源: http://bfts.rubyforge.org/minitest/MiniTest/Assertions.html#method-i-assert_raises
# File lib/minitest/unit.rb, line 337
def assert_raises *exp
msg = "#{exp.pop}\n" if String === exp.last
should_raise = false
begin
yield
should_raise = true
rescue MiniTest::Skip => e
details = "#{msg}#{mu_pp(exp)} exception expected, not"
if exp.include? MiniTest::Skip then
return e
else
raise e
end
rescue Exception => e
details = "#{msg}#{mu_pp(exp)} exception expected, not"
assert(exp.any? { |ex|
ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class
}, exception_details(e, details))
return e
end
exp = exp.first if exp.size == 1
flunk "#{msg}#{mu_pp(exp)} expected but nothing was raised." if
should_raise
end
这将检查传来的例外就是一个实例Module
,如果是使用e.kind_of?(ex)
这将很好地工作作为为实例SomeException
将是一种Exception
,但只有当ex
是一个模块,所以Exception
将无法正常工作。 它需要共同您已经混合成你的异常的东西。
(如这里所示http://ruby-doc.org/core-2.0/Object.html#method-i-kind_of-3F )
这符合minitests自己的测试...
module MyModule; end
class AnError < StandardError; include MyModule; end
....
def test_assert_raises
@tc.assert_raises RuntimeError do
raise "blah"
end
end
def test_assert_raises_module
@tc.assert_raises MyModule do
raise AnError
end
end
(来源: https://github.com/seattlerb/minitest/blob/master/test/minitest/test_minitest_unit.rb )
所以..如果你的异常模块中混合,就可以断言模块上..但比其他一起去@ VGOFF的答案..或延长MINITEST做你想做什么。
注:我爱红宝石是所有开源!