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



有时我想要一个单元测试来确认某些代码引发了异常,而不确切地知道异常类。例如,为了确认它引发了一个异常,即kind_of?(StandardError),我想写以下内容:

assert_raise StandardError do
  my_method
end

如果异常是StandardError的实例,则此断言通过,但如果异常是StandardError子类的实例,此断言将失败。我的最佳解决方案是:u2028u2028

begin
  my_method
rescue StandardError => error
  return
end
assert false, "no error from my_method"

rescue确实以我想要的方式处理异常子类,所以这是有效的。但这有点尴尬。有更好的主意吗?

这是Ruby 1.8.7中的Test::Unit::Assertions模块。

正如您在rubyforge错误跟踪器票证中看到的那样[#8716]将选项添加到Test::Unit::Assertions#assert_raise以允许从2007年开始的子类(!)这是一个仍然打开的功能请求。

如果你非常需要它,你可以对它进行猴痘。

这基本上与您开始时的内容相同,但有点不言自明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"

据我所见,异常在assert_raise 中是可选的

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

你应该能够写

assert_raise { my_method }

最新更新