Ложные классы 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)
}
}
}