Как проверить программы scala.js на наличие побочных эффектов, которые происходят асинхронно с использованием µtest?
У меня есть µtest комплект, который должен проверить, что некоторые асинхронные операции в конечном итоге имеют побочный эффект. Поскольку javascript (и, следовательно, scala.js) является однопоточным, невозможно блокировать и ожидать появления побочного эффекта. Кроме того, µtest eventually
метод не работает в среде исполнения Javascript. Как мне выполнить такой тест?
1 ответ
Решение
Если вы вернете Future
от µtest, тогда тест пройдёт, если будущее удастся, и потерпит неудачу, если будущее потерпит неудачу. Таким образом, вы можете запланировать условную проверку на какой-то момент в будущем без блокировки.
Я написал простую 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*/))
}