【问题标题】:"TypeError: X is not a function" in scalatest testscalatest 测试中的“TypeError:X 不是函数”
【发布时间】:2017-08-23 18:43:55
【问题描述】:

我正在使用 scalatest 编写一个 scala.js 测试,我需要在其中创建一个 XMLHttpRequest 对象。我收到以下错误,不知道为什么。

[info] scala.scalajs.js.JavaScriptException: TypeError: $g.XMLHttpRequest is not a function

我已将失败的测试减少到:

package oat.browser.network

import org.scalajs.dom.XMLHttpRequest
import org.scalatest.FreeSpec

class AjaxToolsSpec extends FreeSpec {

  "AjaxTools" - {
    "should parse a simple object" in {
      val xhr = new XMLHttpRequest()   // Failing line
      this.succeed
    }
  }
}

我已成功包含该行 val xhr = new XMLHttpRequest() 在我的主程序中运行良好。

那么导致这种情况的测试环境有什么奇怪的地方呢?

build.sbt 包含 libraryDependencies ++= Seq(..., "org.scala-js" %%% "scalajs-dom" % "0.9.1",...)

【问题讨论】:

  • 我怀疑这取决于您的测试环境——大多数 JS 测试环境默认不包含 DOM。我相信这可以解释你的错误。 libraryDependencies 条目告诉 Scala.js expect XMLHttpRequest 存在,但如果它真的不存在于您正在执行的环境中,这将无济于事......

标签: scala.js


【解决方案1】:

你需要 configure a JavaScript environment 支持 DOM,例如使用这个 sbt 设置:

jsEnv := new org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv()

这需要您单独安装jsdom(通常使用npm install jsdom)。

【讨论】:

  • 哇!多么快速的反应(26 分钟)。谢谢!但我还在挣扎。起初 jsdomnodejs 没有在 jsenv 包中定义。将 sbt-scalajs 的版本从 0.6.17 提升到 0.6.19。不用找了。在相关模块的设置中添加了“jsDependencies += RuntimeDOM”。然后得到 [error] /Users/bwbecker/oat/src/oat3/node_modules/jsdom/lib/api.js:10 [error] const { URL } = require("whatwg-url"); [错误] ^ [错误] [错误] SyntaxError: Unexpected token { 那是在使用“npm install jsdom”安装的 jsdom 库中。
  • 您的 Node.js 版本太旧。 jsdom 至少需要版本 6 才能工作 IIRC。
  • 运行测试的快速优化阶段比以前花费的时间要长得多。假设这是由于在优化中包含 jsdom 是否合理?有没有办法隔离测试以避免这种情况?似乎把这些测试放到一个单独的模块中就可以了,但这可能是矫枉过正。
  • 不包括jsdom,没有。测试已经在他们自己的“模块”(配置,真的)中,所以我不确定你还想要什么。可能不是快速优化阶段需要更长的时间;这是 jsdom 与非 jsdom 下的启动时间。您认为快速优化是罪魁祸首,因为在 fastOpt 的 开始 和第一次完成的测试运行之间,控制台上没有打印任何内容。但是没有任何东西可以显示 fast opt 的 end 何时发生。为此,您必须查看 last 或启用 debug 日志级别。
  • 有道理。谢谢你的解释。
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 2018-01-09
  • 2014-07-26
  • 2014-04-28
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多