在ScalaTest中使用"不应该生成[exception]"语法

Gui*_*ose 26 specs scala scalatest

我在Scala中使用Specs2和ScalaTest来处理BDD.当我断言不应该抛出给定的异常时,我已经在Specs2中写下了期望.

"do something" in {
 {
   ....
 } must not(throwA[MyException])
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在ScalaTest中编写等效的代码:

"do something" in {
 evaluating {
   ....
 } should not produce[MyException]
}
Run Code Online (Sandbox Code Playgroud)

但这不编译,我找不到这样做的方法.这甚至可能吗?

提前谢谢了.

Wol*_*old 50

当前版本的ScalaTest支持这一点:

noException should be thrownBy 0 / 1
Run Code Online (Sandbox Code Playgroud)

查看文档.

  • 我大约每月一次回答这个问题。总有一天我会记住它。 (4认同)

tra*_*ard 6

这是不可能直接在ScalaTest的最新版本,因为该方法shouldEvaluatingApplicationShouldWrapper不具有过载,需要一个NotWord,只有一个需要ResultOfProduceInvocation[T].

我建议只是让不受欢迎的异常发生,这将导致测试失败.这是经典的方式.

但是如果你觉得你需要更清楚地知道什么是失败的,你可以使用try- catch块来处理错误.如果您发现了您不希望发生的错误,请通过调用该fail方法来处理异常:

fail("That expression shouldn't have thrown a MyExceptionType exception")
Run Code Online (Sandbox Code Playgroud)

  • 截至2016年,这已不再适用.见Wolfram Arnold的回答. (3认同)