如何使用 scalatestplus-play 测试异步方法
How to test asynchronous methods using scalatestplus-play
播放:2.5.10
斯卡拉:2.11.11
ScalaTest 加玩:
"org.scalatestplus.play" %% "scalatestplus-play" % "2.0.1" % Test
如何测试 return Future[Option[]] 的服务方法?
比如这样的东西肯定不行,它说所有测试都通过了,但事实并非如此。我将期望更改为错误,但它仍然 "passes":
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
}
)
}
}
}
问题在于 Future 启动的线程是非守护线程,因此不会阻止应用程序退出。测试启动 future,然后决定它没有更多的工作要做,因此它在到达代码之前完成。解决方案是告诉它等到 future 完成。这可以很简单地完成:
val maxTimeToWait: Int = 1000
val result: Option[Progress] = Await.result(progressA, maxTimeToWait)
播放:2.5.10
斯卡拉:2.11.11
ScalaTest 加玩:
"org.scalatestplus.play" %% "scalatestplus-play" % "2.0.1" % Test
如何测试 return Future[Option[]] 的服务方法?
比如这样的东西肯定不行,它说所有测试都通过了,但事实并非如此。我将期望更改为错误,但它仍然 "passes":
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
}
)
}
}
}
问题在于 Future 启动的线程是非守护线程,因此不会阻止应用程序退出。测试启动 future,然后决定它没有更多的工作要做,因此它在到达代码之前完成。解决方案是告诉它等到 future 完成。这可以很简单地完成:
val maxTimeToWait: Int = 1000
val result: Option[Progress] = Await.result(progressA, maxTimeToWait)