Как использовать uTest-упаковку с тестом scalajs sbt для проверки асинхронных событий?

Я попробовал упаковку теста uTest в GitHub со следующим кодом:

object AjaxExp01SOTest extends TestSuite {

  val log = JSLog.getLogger(getClass().getSimpleName)
  JSLog.setGlobalLevel(Level.DEBUG)

  def tests = TestSuite {

    "OK: GET slP" - {

      val promise = Promise[XMLHttpRequest]

      val callback: (dom.Event, XMLHttpRequest ) => Unit = { (e,x) =>
            log.debug("callback running...")
            log.debug("res.status = " + x.status + "   res.responseText = " + x.responseText )
            promise.success(x)
      }

      def send( method: String, url: String, isAsync: Boolean, timeout: Long, 
      requestHeader: String, requestHeaderValue: String, 
      data: String, callback: (dom.Event, XMLHttpRequest ) => Unit ): XMLHttpRequest = {
            val xhr = new dom.XMLHttpRequest()
            xhr.open(method, url, isAsync )
            xhr.timeout = timeout
            if ( requestHeader != null) {
              xhr.setRequestHeader(requestHeader, requestHeaderValue)
            }
            def cb(e: dom.Event): Unit = { callback(e,xhr) }
            xhr.onload = cb _
            if ( data != null) {
              xhr.send(data)
            } else {
              xhr.send()
            }
            xhr
      }

      log.debug("send begin")
      val url = "http://localhost:9000/slG/124"
      val res = send("GET", url, true, 0, null, null, null, callback)
      log.debug("send end")

      promise.future
    }

  }

  override def utestWrap(runBody: => concurrent.Future[Any])
           (implicit ec: ExecutionContext): concurrent.Future[Any] = {
    val f = runBody
    f.onComplete {
      case Success(a) if ( a != null )=> { log.debug("SUCCESS " + a.getClass.getSimpleName) } // BoxedUnit,
      case Success(a) => { log.debug("SUCCESS a == null") }
      case Failure(a) => log.debug("FAILURE")
    }
    log.debug("utestWrap begin")
    f
  }
}

Это имеет следующие результаты:

21:03:23.164 DEBUG AjaxExp01SOTest - SUCCESS BoxedUnit
21:03:23.168 DEBUG AjaxExp01SOTest - utestWrap begin
21:03:23.172 DEBUG AjaxExp01SOTest - OK: GET slP   *****
21:03:23.174 DEBUG AjaxExp01SOTest - send begin
21:03:23.177 DEBUG AjaxExp01SOTest - send end
21:03:23.180 DEBUG AjaxExp01SOTest - utestWrap begin

Клиент отправил запрос GET на сервер, который ответил после задержки, но обратный вызов клиента никогда не вызывался. Тест застрял при ожидании обратного вызова.

Что не так в этом коде? Скорее всего utestWrap имеет ошибку или другое недоразумение.

Еще один (второстепенный) вопрос: что такое "УСПЕШНЫЙ BoxedUnit"? В TestSuite есть только один тестовый случай "GET slP", который начинается после "SUCCESS BoxedUnit" и никогда не достигает "SUCCESS XMLHttpRequest".

0 ответов

Другие вопросы по тегам