模拟 Scala.js 类
Mock Scala.js classes
我正在尝试测试用 Scala.js 编写的 React 组件,它从服务器获取类别列表。我能够为组件提供替代 jQuery 实例,但无法编译 jQuery 模拟本身。这是模拟的代码:
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) 特征的成员,classes 和扩展 js.Any 的对象只能包含调用 js.native 的成员。这将在 1.0 中强制执行。
override def get(url: String, data: js.Any, success: js.Any, dataType: js.Any): JQueryXHR = {
错误:(19, 9) 特征,classes 和扩展 js.Any 的对象可能没有内部特征,classes 或对象
new JQueryXHR {}
有没有其他方法可以在 Scala.js 中模拟任何本机 class(或者实际上有任何其他方法来测试后端查询)?
编辑
如果我扔掉 extends JQueryStatic
和 new JQueryXHR {}
并更改 def get
的 return 类型,class 可以正常编译。这样我就可以编写 jQuery 包装器来处理 AJAX 东西,我将能够模拟这些东西。这会起作用,但似乎很麻烦。还有其他方法吗?
我已经使用我的外观创建了测试,它是模拟的:
门面
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)
}
}
}
我正在尝试测试用 Scala.js 编写的 React 组件,它从服务器获取类别列表。我能够为组件提供替代 jQuery 实例,但无法编译 jQuery 模拟本身。这是模拟的代码:
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) 特征的成员,classes 和扩展 js.Any 的对象只能包含调用 js.native 的成员。这将在 1.0 中强制执行。
override def get(url: String, data: js.Any, success: js.Any, dataType: js.Any): JQueryXHR = {
错误:(19, 9) 特征,classes 和扩展 js.Any 的对象可能没有内部特征,classes 或对象
new JQueryXHR {}
有没有其他方法可以在 Scala.js 中模拟任何本机 class(或者实际上有任何其他方法来测试后端查询)?
编辑
如果我扔掉 extends JQueryStatic
和 new JQueryXHR {}
并更改 def get
的 return 类型,class 可以正常编译。这样我就可以编写 jQuery 包装器来处理 AJAX 东西,我将能够模拟这些东西。这会起作用,但似乎很麻烦。还有其他方法吗?
我已经使用我的外观创建了测试,它是模拟的:
门面
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)
}
}
}