3
我有一个μtest套件,需要检查一些异步操作最终会产生副作用。由于JavaScript(因此scala.js)是单线程的,因此无法阻止并等待副作用发生。另外,μtesteventually
方法在JavaScript运行时不起作用。我如何进行这样的测试?如何测试使用μtest异步发生的副作用scala.js程序?
我有一个μtest套件,需要检查一些异步操作最终会产生副作用。由于JavaScript(因此scala.js)是单线程的,因此无法阻止并等待副作用发生。另外,μtesteventually
方法在JavaScript运行时不起作用。我如何进行这样的测试?如何测试使用μtest异步发生的副作用scala.js程序?
如果您从μtest返回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*/))
}