在 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 的成员