gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:08:19 26 4
gpt4 key购买 nike

import org.scalatest.{ FlatSpec, Matchers, ParallelTestExecution }
import org.scalatest.concurrent.ScalaFutures
import org.apache.thrift.TApplicationException

class Test extends FlatSpec with Matchers with ScalaFutures with ParallelTestExecution {
it should "throw org.apache.thrift.TApplicationException for invalid Ids" in {
val future: Future[Response] = ThriftClient.thriftRequest
whenReady(future) {
res => {
intercept[TApplicationException] {
}
}
}
}
}

问题:如何在不阻塞的情况下断言 Futures 中的预期失败?上面的方法不起作用,异常在 intercept block 之前抛出。

最佳答案

我知道这可能有点晚了,但是 ScalaTest 通过混合 ScalaFutures 特征或直接在测试函数中使用它,提供了开箱即用的此功能(我相信从版本 2 开始)。看哪!

test("some test") {
val f: Future[Something] = someObject.giveMeAFuture
ScalaFutures.whenReady(f.failed) { e =>
e shouldBe a [SomeExceptionType]
}
}

或者您可以在那里执行一些其他断言。基本上,如果你的 future 没有像你预期的那样失败,那么测试就会失败。如果失败,但抛出不同的异常,则测试将失败。好,易于! =]

<小时/>

厚颜无耻的编辑:

您还可以使用此方法来测试返回 future 的任何内容:

test("some test") {
val f: Future[Something] = someObject.giveMeAFuture
ScalaFutures.whenReady(f) { s =>
// run assertions against the object returned in the future
}
}
<小时/>

最近编辑!

我只是想根据较新版本的 Scala 测试使用更多有用的信息来更新此答案。各种规范特征现在都具有异步支持,因此您不必扩展 WordSpec,而是扩展 AsyncWordSpec,而不是依赖 whenReady 如上所述调用,您只需在测试中直接映射您的 future 即可。

示例:

class SomeSpec extends Async[*]Spec with Matchers {

...

test("some test") {
someObject.funcThatReturnsAFutureOfSomething map { something =>
// run assertions against the 'something' returned in the future
}
}
}

关于ScalaTest:在失败的 future 中断言异常(非阻塞),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20925352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com