【问题标题】:Using the "should NOT produce [exception]" syntax in ScalaTest在 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 的默认行为(如果发生任何异常则测试失败)已经足够了。谢谢。

标签: scala specs 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) }
猜你喜欢
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
相关资源
最近更新 更多