这似乎很奇怪。
来自: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 以执行您想要的操作。
注意:我喜欢 ruby 都是开源的!