如何获取assert_raise来处理异常子类

时间:2013-12-16 18:03:29

标签: ruby unit-testing exception assertions

有时我想要一个单元测试来确认某些代码引发异常,而不完全知道异常类。例如,为了确认它引发了一个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模块。

3 个答案:

答案 0 :(得分:2)

正如您在rubyforge bugtracker ticket [#8716] Add option to Test::Unit::Assertions#assert_raise to allow subclasses from 2007(!)中所看到的,这是一个仍处于打开状态的功能请求。

如果你真的需要它,你可以对这个功能进行monkeypatch。

答案 1 :(得分:0)

据我所知,assert_raise

中的例外是可选的
  

测试给定的块是否引发异常。可接受的异常类型可以作为可选参数给出。

你应该可以写

assert_raise { my_method }

答案 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"