在ScalaTest中使用“should NOT produce [exception]”语法

35

我在使用Specs2和ScalaTest进行Scala语言的BDD测试,其中我使用Specs2编写了一个期望,断言某个特定异常不会被抛出。

"do something" in {
 {
   ....
 } must not(throwA[MyException])
}

我希望能够用ScalaTest写出类似于以下的代码:

"do something" in {
 evaluating {
   ....
 } should not produce[MyException]
}

但是这段代码无法编译,我找不到方法解决它。这种方法可行吗?

提前致谢。


有趣。你能详细说明一下使用情况吗?我认为你需要更具体的东西。它应该抛出特定的异常,或者不应该抛出任何异常。你的意思是你想断言表达式可以正常返回或抛出除你不想看到的异常之外的任何异常。如果你的用例有意义,我可以添加“不产生”语法。谢谢。 - Bill Venners
@Bill,经过更长时间的思考我的当前用例,我认为ScalaTest的默认行为(如果发生任何异常则测试失败)已经足够了。谢谢。 - Guillaume Belrose
2个回答

79

ScalaTest的当前版本支持此功能:

noException should be thrownBy 0 / 1

请查看文档


10
我大约每个月会回答这个问题。总有一天我会把它记住。 - Def_Os
我正在使用GivenWhenThen特性,在我的Then子句中粘贴了这段代码。0/1语法是什么意思?我在文档中找不到它的解释。 - sandbar
1
@sandbar:“0/1”是零除以一的商。这只是一个不会抛出异常的示例操作。与“1/0”相比,它将引发除以零异常。我本可以使用任何其他不会抛出异常的操作。 - Wolfram Arnold
我其实不确定这个的使用场景是什么。如果函数或操作抛出异常,测试无论如何都会失败。这只是为了清楚地说明测试中应该发生什么吗? - sandbar
@sandbar:这通常用于修复错误。代码遇到了一个异常情况,由于一个错误,它应该被处理。在修复错误时,最好的做法是首先在测试中重现问题,查看测试失败(即在受测试代码中抛出异常),然后修复错误并查看测试通过。 - Wolfram Arnold

8
在最新版本的ScalaTest中,直接实现这个功能是不可能的,因为EvaluatingApplicationShouldWrappershould方法没有重载函数可以接受NotWord,只有一个可以接受ResultOfProduceInvocation[T]的函数。
我建议让不需要的异常发生,这将导致测试失败。这是经典的方式。
但是,如果你觉得需要更清晰地了解到底哪里出了问题,你可以使用try-catch块来处理错误。如果你捕获了不想发生的错误,请使用fail方法来处理异常。
fail("That expression shouldn't have thrown a MyExceptionType exception")

4
截至2016年,这个说法已不再正确。请参考 Wolfram Arnold 的回答。 - francoisr
1
这样就可以仅在特定异常发生时失败。使用try-catch和fail():try { doSomething() } catch { case ex: SomeException => fail("不应该抛出SomeException异常", ex) } - Bohumir Zamecnik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接