如何使用 µtest 测试 scala.js 程序异步发生的副作用?

How do I test scala.js programs for side-effects that happen asynchronously using µtest?

我有一个 µtest 套件需要检查某些异步操作最终是否会产生副作用。由于 javascript(因此 scala.js)是单线程的,因此不可能阻塞并等待副作用发生。此外,µtest eventually 方法不适用于 javascript 运行时。我该如何进行这样的测试?

如果您 return 来自 µtest 的 Future,那么如果 future 成功则测试将通过,如果 future 失败则测试失败。因此,您可以将条件检查安排在未来的某个时间点而不会阻塞。

我写了一个简单的 eventually 方法来完成这个:

package utest

import rx.ops.DomScheduler

import scala.concurrent.{Promise, Future}
import scala.concurrent.duration.FiniteDuration
import scala.util.{Failure, Success, Try}

object JsOps {
  import scala.concurrent.ExecutionContext.Implicits.global
  val scheduler = new DomScheduler

  def eventually(eval: => Try[Boolean])(implicit timeout: FiniteDuration): Future[Boolean] = {
    val p = Promise[Boolean]()
    scheduler.scheduleOnce(timeout) {
      eval match {
        case Success(b) => p.success(b)
        case Failure(t) => p.failure(t)
      }
    }
    p.future
  }
}

这是一个用法示例:

  import scala.concurrent.duration._
  implicit val timeout = 30.milliseconds

  eventually {
    if (/*condition holds true*/) {
      Success(true)
    } else Failure(new RuntimeException(/*error message*/))
  }