有时我想要一个单元测试来确认某些代码引发异常,而不完全知道异常类。例如,为了确认它引发了一个kind_of?(StandardError)
的异常,我想写这个:
assert_raise StandardError do
my_method
end
如果异常是StandardError
的实例,则该断言通过,但如果异常是StandardError
的子类的实例则失败。我最好的解决方案是:
begin
my_method
rescue StandardError => error
return
end
assert false, "no error from my_method"
rescue
以我想要的方式处理异常子类,所以这很有用。但它有点尴尬。有更好的想法吗?
这是Ruby 1.8.7中的Test :: Unit :: Assertions模块。
答案 0 :(得分:2)
正如您在rubyforge bugtracker ticket [#8716] Add option to Test::Unit::Assertions#assert_raise to allow subclasses from 2007(!)中所看到的,这是一个仍处于打开状态的功能请求。
如果你真的需要它,你可以对这个功能进行monkeypatch。
答案 1 :(得分:0)
答案 2 :(得分:0)
这与你的开始基本相同,但是更加自我解释的IMO:
begin
my_method
rescue => e
# Could be any number of error classes:
# HTTPClient::ConnectTimeoutError, SocketError, etc.
assert e.class.ancestors.include?(StandardError), "Expected my_method to raise a subclass of StandardError, but #{e.class} was raised"
return
end
# Force the test to fail if no error was raised
assert false, "Expected my_method to raise a subclass of StandardError, but no error was raised"