如何在 Scala 中测试期货列表

igx*_*igx 3 scala scalatest

我想测试一个方法(使用 ScalaTest),它接受一个List值并在数据库中更新它们,Future为每个值返回一个表示更新成功的值。是否有一种惯用的方法来验证所有值都保留在数据库中?我如何知道Future从方法返回的所有s何时完成?

trait Result
case object A extends Result
case object B extends Result

def addToDB(i: String): Future[Result]

def persistUsers(users: List[String]): List[Future[Result]] = {
  users.map(addToDB)
}
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情(有效)但是有更好的方法吗?

"should update list " in {
  val users = List("a","b","c")

  persistUsers(users)

  Thread.sleep(1000)

  whenReady(db.find("a")) { result => result shouldEqual A }
  .
  .
  .

}
Run Code Online (Sandbox Code Playgroud)

小智 6

所以你想等待一个 Futures 列表,你有几个选择(我不知道 ScalaTest 是否有一个 whenReady 一个 Futures 列表),其中一个是Future.sequence(futureList)用来创建一个Future[List[A]]

val futures = persistUsers(users)

whenReady(Future.sequence(futures)){result => result shouldEqual users}
Run Code Online (Sandbox Code Playgroud)