Как проверить программы 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*/))
  }
Другие вопросы по тегам