scala - 如何使用 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
}
)
}
}
}
解决方案
问题是由 Future 启动的线程是一个非守护线程,因此不会阻止应用程序退出。测试开始未来,然后决定它没有更多的工作要做,所以它在到达代码之前完成。解决方案是告诉它等到未来完成。这可以通过以下方式非常简单地完成:
val maxTimeToWait: Int = 1000
val result: Option[Progress] = Await.result(progressA, maxTimeToWait)
推荐阅读
- typescript - 从转换器 API 访问 ParsedCommandLine
- mysql - 子字符串和字符索引的 SQL 语法错误
- macos - 如何将 mac osx 中的弹性堆栈从 6.8.7 升级到 7.x(最新)
- python - 获取文本中“x”个单词的组
- python - 有没有办法使用 Crealytics spark-excel 包将带有 ArrayType 列的 Spark 数据帧写入 Excel?
- networking - 无法与 rtnetlink 对话:不支持操作
- laravel - 如何正确地将排序模型从我的控制器发送到 Laravel API 资源集合?
- sql - 根据折扣查询前 5 名产品和陈列室
- python-3.x - PyCharm 中的 Folium 地图问题
- javascript - 如何在html表格中隐藏元素