模拟Scala.js课程

时间:2015-08-19 07:03:32

标签: jquery testing mocking scala.js utest

我试图测试用Scala.js编写的React组件,它从服务器中获取类别列表。我能够为组件提供替代的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 JQueryStaticnew JQueryXHR {}并更改def get的返回类型,则该类编译正常。这样我就可以编写jQuery包装器处理AJAX的东西,我将能够模拟。这样可行,但似乎是一个非常麻烦的事情。还有其他办法吗?

1 个答案:

答案 0 :(得分: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)
    }
  }
}