Ложные классы Scala.js

Я пытаюсь протестировать компонент React, написанный на Scala.js, который выбирает список категорий с сервера. Мне удалось предоставить альтернативный экземпляр jQuery для компонента, но сам jQuery mock не может быть скомпилирован. Вот код макета:

import org.scalajs.jquery.{JQueryXHR, JQueryStatic}

import scala.scalajs.js
import utest._

class jQueryMock extends JQueryStatic {

  var awaitedRequests = Map.empty[String, PartialFunction[js.Any, js.Any]]

  def whenGet(url: String)(response: PartialFunction[js.Any, js.Any]): Unit = {
    awaitedRequests += (url -> response)
  }

  override def get(url: String, data: js.Any, success: js.Any, dataType: js.Any): JQueryXHR = {
    awaitedRequests.get(url) match {
      case Some(response) =>
        if(response.isDefinedAt(data))
          success.asInstanceOf[(js.Any) => Unit](response(data))
        else
          assert(false)
      case None => assert(false)
    }
    new JQueryXHR {}
  }
}

В этом коде есть две проблемы в соответствии с компилятором Scala.js:

  • Предупреждение:(14, 95) Члены признаков, классов и объектов, расширяющих js.Any, могут содержать только те элементы, которые вызывают js.native. Это будет применено в 1.0.

    override def get(url: String, data: js.Any, success: js.Any, dataType: js.Any): JQueryXHR = {

  • Ошибка:(19, 9) Черты, классы и объекты, расширяющие js.Any может не иметь внутренних черт, классов или объектов

    new JQueryXHR {}

Есть ли какой-либо другой способ макетировать какой-либо нативный класс в Scala.js (или на самом деле любой другой способ проверить запросы бэкэнда)?

редактировать

Если я выброшу extends JQueryStatic а также new JQueryXHR {} и измените тип возврата def get, класс компилируется нормально. Таким образом, я мог бы написать jQuery-оболочку для работы с AJAX, которую я смогу высмеять. Это будет работать, но, похоже, очень много проблем. Есть ли другой способ сделать это?

1 ответ

Решение

Я создал тесты, используя мой фасад, и это макет:

Фасад

class Http {
  def get(url: String)(success: (js.UndefOr[js.Any]) => Unit): Unit =
    jQuery.getJSON(url, js.undefined, success)
}

издеваться

class HttpMock extends Http {

  var awaitedRequests = Map.empty[String, js.Any]

  def whenGet(url: String, response: js.Any): Unit = {
    awaitedRequests += (url -> response)
  }

  def verifyNoOutstandingRequests() =
    assert(awaitedRequests.isEmpty)

  override def get(url: String)(success: (js.UndefOr[js.Any]) => Unit): Unit = {
    awaitedRequests.get(url) match {
      case Some(response) =>
          success(response)
          awaitedRequests -= url
      case None => assert(false)
    }
  }
}
Другие вопросы по тегам