【问题标题】:Mock Scala.js classes模拟 Scala.js 类
【发布时间】:2015-11-12 08:18:29
【问题描述】:

我正在尝试测试用 Scala.js 编写的 React 组件,该组件从服务器获取类别列表。我能够为组件提供替代 jQuery 实例,但无法编译 jQuery mock 本身。这是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 JQueryStaticnew JQueryXHR {} 并更改 def get 的返回类型,则该类编译正常。通过这种方式,我可以编写处理 AJAX 内容的 jQuery 包装器,我将能够对其进行模拟。这会起作用,但似乎很麻烦。有没有其他方法可以做到这一点?

【问题讨论】:

标签: jquery testing mocking scala.js utest


【解决方案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)
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多