Scala,ZIO - 如何测试效果是否返回成功?
Scala, ZIO - how to test if effect returned success?
我有一个检查模拟服务的简单测试代码:
runtime.unsafeRun(service.run.forkDaemon)
eventually(Timeout(Span(5, Seconds)), Interval(Span(1, Seconds))) {
verify(someMockResult).create(any[String], any[String])
}
service
returns Task[Done]
。它工作正常,但我也想检查一下是否 unsafeRun
returns succeed
。我试着这样做:
runtime.unsafeRun(service.run.forkDaemon) shouldBe succeed
或:
val result = runtime.unsafeRun(service.run.forkDaemon)
eventually(Timeout(Span(5, Seconds)), Interval(Span(1, Seconds))) {
result shouldBe succeed
}
但它不起作用。有什么方法可以检查效果结果是否成功?
首先,你误解了org.scalatest.Succeed
(别名为succeed
)的意思。仅当您需要使用 Assertion
类型结束函数体时才需要它。基本上等于assert(true)
。这不是一个实际测试某些东西的断言。
如果我理解正确,您想检查我们定义为 testTask
的执行情况:
val testTask: Task[Done] = service.run.forkDaemon
val res = runtime.unsafeRun(testTask)
同步执行 的代码中存在问题。这意味着这行代码的评估有两种可能的结果:1) 它成功执行 testTask
并将结果分配给 res
变量,或者 2) testTask
的执行失败,并且它抛出异常。
所以,基本上,如果没有异常,就成功了。
另一种更方便地检查这一点的方法是将其评估为 Future
和 runtime.unsafeRunToFuture
,然后断言 future
最终成功。例如,您可以这样做:
assert(
future.value match {
case Some(Success(_)) => true
case _ => false
}
)
我有一个检查模拟服务的简单测试代码:
runtime.unsafeRun(service.run.forkDaemon)
eventually(Timeout(Span(5, Seconds)), Interval(Span(1, Seconds))) {
verify(someMockResult).create(any[String], any[String])
}
service
returns Task[Done]
。它工作正常,但我也想检查一下是否 unsafeRun
returns succeed
。我试着这样做:
runtime.unsafeRun(service.run.forkDaemon) shouldBe succeed
或:
val result = runtime.unsafeRun(service.run.forkDaemon)
eventually(Timeout(Span(5, Seconds)), Interval(Span(1, Seconds))) {
result shouldBe succeed
}
但它不起作用。有什么方法可以检查效果结果是否成功?
首先,你误解了org.scalatest.Succeed
(别名为succeed
)的意思。仅当您需要使用 Assertion
类型结束函数体时才需要它。基本上等于assert(true)
。这不是一个实际测试某些东西的断言。
如果我理解正确,您想检查我们定义为 testTask
的执行情况:
val testTask: Task[Done] = service.run.forkDaemon
val res = runtime.unsafeRun(testTask)
同步执行 的代码中存在问题。这意味着这行代码的评估有两种可能的结果:1) 它成功执行 testTask
并将结果分配给 res
变量,或者 2) testTask
的执行失败,并且它抛出异常。
所以,基本上,如果没有异常,就成功了。
另一种更方便地检查这一点的方法是将其评估为 Future
和 runtime.unsafeRunToFuture
,然后断言 future
最终成功。例如,您可以这样做:
assert(
future.value match {
case Some(Success(_)) => true
case _ => false
}
)