在 ScalaTest 中使用“不应该产生 [异常]”语法

Posted

技术标签:

【中文标题】在 ScalaTest 中使用“不应该产生 [异常]”语法【英文标题】:Using the "should NOT produce [exception]" syntax in ScalaTest 【发布时间】:2011-10-23 02:52:06 【问题描述】:

我正在使用 Specs2 和 ScalaTest 在 Scala 中进行 BDD。当我断言不应抛出给定异常时,我已经在 Specs2 中写下了期望。

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

我希望能够在 ScalaTest 中编写等价的代码,例如:

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

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

非常感谢。

【问题讨论】:

有趣。你能详细说明用例是什么吗?我想你会想要更具体的东西。要么它应该抛出一个特定的异常,要么它不应该抛出任何异常。你的意思是你想要断言表达式可以正常返回或抛出任何异常,除了你不想看到的那个。如果您的用例有意义,我可以添加“不生产”语法。谢谢。 @Bill,在考虑了我当前的用例之后,我认为 ScalaTest 的默认行为(如果发生任何异常则测试失败)已经足够了。谢谢。 【参考方案1】:

当前版本的 ScalaTest 确实支持这个:

noException should be thrownBy 0 / 1

见docs。

【讨论】:

我大约每月来一次这个答案。总有一天我会记住的。【参考方案2】:

这在最新版本的 ScalaTest 中无法直接实现,因为 EvaluatingApplicationShouldWrapper 的方法 should 没有采用 NotWord 的重载,只有采用 ResultOfProduceInvocation[T] 的重载。

我建议让不想要的异常发生,这将使测试失败。这是经典的方式。

但是,如果您觉得需要更清楚地了解究竟是什么失败了,您可以使用 try-catch 块来处理错误。如果您捕获到您不想发生的错误,请通过调用fail 方法来处理异常:

fail("That expression shouldn't have thrown a MyExceptionType exception")

【讨论】:

自 2016 年起,这不再适用。请参阅 Wolfram Arnold 的回答。 这种方式只能在特定异常上失败。使用 try-catch 和 fail():try doSomething() catch case ex: SomeException => fail("Should not throw SomeException", ex)

以上是关于在 ScalaTest 中使用“不应该产生 [异常]”语法的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scalatest 运行 sbt 测试?我有一个错误:对象 scalatest 不是包 org 的成员

如何在单线程中运行 ScalaTest 套件?

如何让测试在 Scalatest 中始终以相同的顺序运行?

使用 ScalaTest 和 SBT android-sdk-plugin

ScalaTest:在失败的期货中断言异常(非阻塞)

如何在ScalaTest中按顺序运行类中的测试?