gpt4 book ai didi

scala - 断言返回类型为 Future[Unit] 的 scala 方法的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-05 08:32:22 25 4
gpt4 key购买 nike

我有一个方法。此方法可能返回 Future.failed(.....) 或 Future.successful(())。

def calculate(x: Int, y: Int): future [单位] = {…………

现在我需要测试这个方法。对于验证 Future.successful(()) case 的测试,断言的最佳方法是什么。

最佳答案

Scalatest 提供了几种使用 Future 的方法。

选项 1: isReadyWithin

import org.scalatest.concurrent.ScalaFutures._
import scala.concurrent.duration._

calculate(1, 3).isReadyWithin(1.second) should be(true)

如果你想在这里做一些有返回值的事情,你可以使用whenReady:

implicit val patienceConfig = PatienceConfig(1.second)

def calculateWithResult(i: Int, j: Int): Future[Int] = ???

whenReady(calculateWithResult(1,3)) { result =>
result should be(4)
}

您需要一个范围内的隐式 PatienceConfig 来告诉 whenReady 何时由于超时而导致测试失败。我相信在 scalatest 库之一中有一个默认时间段,但选择的时间段非常短 - 大约 10 毫秒 - 并且通常会导致不稳定的测试。

选项 2: AsyncXSpec

AsyncFlatSpecFreeSpecFunSpec 等特性。除了任何测试现在都必须返回 Future[Assertion] 类型的值外,它们的工作方式与其同步变体非常相似。例如:

class Test extends AsyncFreeSpec {
"An asynchronous method" - {
"should succeed" in {
calculate(1,3).map { _ =>
// just want to make sure the future completes
succeed
}
}
}
}

同样,您可以在此处针对结果运行测试。请注意,此变体意味着您的测试类中的每个 测试都必须返回一个Future,因此如果您想混合使用同步和异步测试,这不是很好。老实说,我也不确定 AsyncXSpec 如何选择它的超时值。

选项不要: Await.result

我建议不要使用 Await.result,因为它会在持续时间内阻塞线程。据我所知,以上两个选项旨在让异步测试可以轻松地并行运行。

注意事项:

在进行异步测试时,您需要格外小心超时。时间太长,如果出现问题,您的测试可能会挂起很长时间。太短了,你的测试会不稳定。并且该程序在不同环境中的表现可能不同,因此您可能会发现在本地计算机上完全足够的超时会使构建服务器上的测试有 5% 的时间失败。小心!

关于scala - 断言返回类型为 Future[Unit] 的 scala 方法的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51210054/

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