使用MINITEST规范,我可以测试代码中引发了一个特定的异常如下:检查任何异常
proc { foo.do_bar }.must_raise SomeException
但是,我不关心具体的异常是什么,我只是想确认抛出一些异常。如果我或其他开发人员决定更改Foo#do_bar引发的异常,那么如果预期的异常足够一般地指定,我的测试就不必更改。
也就是说,我想这样写测试(例外是类SomeException的祖先):
proc { foo.do_bar }.must_raise Exception
通过这导致了失败,当我运行测试:
[Exception] exception expected, not
Class: <SomeException>
我可以通过关于例外的更一般的方式来编写Minitest规范吗?我想检查任何异常而不是特定异常的实际原因是,我使用的是第三方Gem,它是引发异常的代码。事实上,我的方法A获取由第三方方法B调用.A引发MyException,但B捕获该异常,并重新产生一个不同的异常。这个异常与我的异常[和这个消息是我应该在测试中验证的]相同的消息,但是不同的类别。)
所以你不在乎是否是'SystemStackError'或'SystemExit'或'ThreadError'?那为什么要麻烦测试?你应该测试具体细节。否则,你如何向其他开发者传达你的意图是什么? – vgoff
@vgoff:为了简洁起见,我将其放弃了,但我正在使用Ruby Racer,它将JavaScript绑定到Ruby,反之亦然。如果我的Ruby代码引发了一个异常,这个异常最终会成为一个RR类,V8 :: Error,而不是我的代码引发的异常。这与我正在使用的第三方Gem的内部相关,这些是我从测试甚至实现的角度来看都不关心的细节。从测试的角度来看,重要的是我的Ruby代码检测到无效条件并引发异常。 – Jimothy
@vgoff虽然它改变了“为什么”,但就我所知,它并没有改变“如何”。您在第一条评论中提出了一个很好的观点,那就是一般而言,测试时应该是特定的。也就是说,我不想让我的问题过于具体,因为可能有其他人出于任何原因希望使用MiniTest测试任何异常。但是,我会为我的问题添加解释性文字,为什么我想这样做。 – Jimothy