首页 > 解决方案 > 如何使用 scalatestplus-play 测试异步方法

问题描述

玩 :2.5.10

斯卡拉:2.11.11

ScalaTest 加播放: "org.scalatestplus.play" %% "scalatestplus-play" % "2.0.1" % Test

如何测试返回 Future[Option[]] 的服务方法?

例如,这样的事情肯定是行不通的,它说所有的测试都通过了,但事实并非如此。我将期望更改为错误的东西,但它仍然“通过”:

class SomeProgressTestExampleSpec extends PlaySpec with OneAppPerSuite {
  private val progressService = 
  app.injector.instanceOf(classOf[ProgressService])

  "Retriving progress by user" must
   {
    "reflect accurate progress" in
    {
      val progressA : Future[Option[Progress]] = progressService.readByUserId(1)

      progressA.map(progressOpt =>
        progressOpt
          .foreach{
            progress =>
              progress.soFar mustBe 59
          }
      )

    }
  }
}

标签: scalaplayframeworkscalatest

解决方案


问题是由 Future 启动的线程是一个非守护线程,因此不会阻止应用程序退出。测试开始未来,然后决定它没有更多的工作要做,所以它在到达代码之前完成。解决方案是告诉它等到未来完成。这可以通过以下方式非常简单地完成:

val maxTimeToWait: Int = 1000
val result: Option[Progress] = Await.result(progressA, maxTimeToWait)

推荐阅读