如何在多个环境(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只是为了改变设置是完全愚蠢的。
我觉得我正在俯视一些简单的事情。
我如何编写一个需要jQuery
testing文件并在多个环境中运行?
- 在terminal通过
npm test
- 在浏览器中
附加信息
这些信息不应该有必要解决这里的根本问题。 一般的解决办法是可以接受 但是,我正在使用的工具可能有组件,可以更容易地解决这个问题。
- 我正在使用
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秒,所以速度非常快。