如何在多个环境(终端和浏览器)中运行JavaScript测试脚本?

时间:2014-10-13 07:28:54

标签: javascript node.js

假设我有一些需要jQuery的测试。好吧,我们不必相信,我实际上有测试。测试本身并不重要,但他们依赖于jQuery 的事实非常重要。

  

免责声明:这是node.js,因此无法依赖于解决方案中的全局变量。必须使用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 $
// ...

这是一个很大的问题!

每个环境的设置都不同,但重复每个测试只是为了更改设置是完全愚蠢的。

我觉得我忽视了一些简单的事情。


如何编写需要jQuery的单个测试文件并在多个环境中运行?

    通过npm test 在终端中
  1. 在浏览器中

  2. 其他信息

    这些信息不一定是解决这里根本问题的必要条件;一般的解决方案是可以接受但是,我正在使用的工具可能包含更容易解决此问题的组件。

    • 我正在使用mocha进行测试
    • 我正在使用webpack
    • 我没有和jsdom结婚,如果有更好的东西,那就让我们用吧!
    • 我没有使用phantomjs,但如果它让我的生活更轻松,那就让我们做吧!

    其他想法:

    • 这个jQuery是不是因为没有坚持实际的UMD?为什么会根据env要求提供不同的API?

1 个答案:

答案 0 :(得分:1)

我正在使用karma直接从命令行运行我的单元测试(CI也是gulp)。

Karma使用phantomjs在无头浏览器中运行测试,您可以将其配置为在真实浏览器中运行。

gulp内部的业力配置示例:

// 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);
});

如果我的测试需要大约。运行750次测试需要10秒钟,所以速度非常快。