如何在多个环境(terminal和浏览器)中运行JavaScripttesting脚本?

比方说,我有一些需要jQuery的testing。 那么,我们不必相信,我实际上有testing。 testing本身并不重要,但是他们依赖于jQuery的事实重要。

免责声明:这是node.js,所以你不能依赖你的解决scheme中的全局variables。 必须使用require将任何依赖关系调用到文件中。

在服务器上,我们需要这个API(模拟服务器端jquery所需的窗口对象)

 // somefile.js var jsdom = require("jsdom").jsdom; var window = jsdom().parentWindow(); var $ = require("jquery")(window); // my tests that depend on $ // ... 

在客户端,我们需要一个稍微不同的API

 // somefile.js // jsdom is not required obviously // window is not needed because we don't have to pass it to jquery explicitly // assume `require` is available // requiring jquery is different var $ = require("jquery"); // my tests that depend on $ // ... 

这是一个巨大的问题!

每个环境的设置是不同的,但重复每个testing只是为了改变设置是完全愚蠢的。

我觉得我正在俯视一些简单的事情。


我如何编写一个需要jQuerytesting文件并在多个环境中运行?

  1. 在terminal通过npm test
  2. 在浏览器中

附加信息

这些信息不应该有必要解决这里的根本问题。 一般的解决办法是可以接受 但是,我正在使用的工具可能有组件,可以更容易地解决这个问题。

  • 我正在使用mocha进行testing
  • 我正在使用webpack
  • 我没有嫁给jsdom ,如果有更好的东西,让我们使用它!
  • 我没有使用phantomjs ,但如果它让我的生活更轻松,就让我们来做吧!

其他想法:

  • 这是jQuery的错误不坚持一个实际的UMD ? 为什么会有不同的API可用基于哪个env要求?

我正在使用karma从命令行直接运行我的unit testing(CI也是一样)。

Karma使用phantomjs在无头浏览器中运行testing,您可以将其configuration为在真实浏览器中运行。

gulp里面的业力configuration的例子:

 // Run karma tests gulp.task("unit", function (done) { var parseConfig = require("karma/lib/config").parseConfig, server = karma.server, karmaConfig = path.resolve("karma.conf.js"), config = parseConfig(karmaConfig, { singleRun: true, client: { specRegexp: ".spec.js$" } }); server.start(config, done); }); 

在我的testing情况下,大约需要。 运行750次testing10秒,所以速度非常快。