使用requirejs进行无头单元测试的设置

And*_*rew 4 javascript unit-testing mocking requirejs

这似乎是一种搜索圣杯,但我正在寻找一个JavaScript单元测试环境的设置.要求是:

  • 测试需要AMD模块
  • 通过模拟依赖关系来隔离每个模块
  • 可在开发期间在浏览器中测试
  • 可在无头环境中测试,以实现持续集成

除了无头嘲笑之外的一切似乎都是直截了当的.

到目前为止,我已经测试了JS-Test-Driver,KarmaPhantomjs,并且为了模拟,我使用了SquireIsolate - 以及在这里答案中的代码实现,似乎没有什么工作正常.我一次又一次地遇到的主要问题是测试框架在所有测试运行之前返回 - 主要是因为模拟需要它们自己的require()依赖项.

任何帮助(或脚手架)都会有所帮助!

[编辑]

我在Github上建立了一个基本的,有效的Karma项目,并使用chai-expect作为匹配库,进行了一些模拟测试.我将尝试添加更多有用的文档,但如果您熟悉Karma,则扩展应该非常简单.只是git clone然后npm install让它运行.

Daf*_*aff 5

通常,每个测试框架都允许您进行异步测试并手动启动测试,这应该是您所需要的.

QUnit

对于QUnit,您需要将设置autostart设置为false手动启用踢踢测试:

QUnit.config.autostart = false;

require(['test/qunit/test.js'], function() {
    QUnit.start();
});
Run Code Online (Sandbox Code Playgroud)

如果在测试期间异步加载东西,只需使用QUnits stop()start()方法:

test('something that loads asynchronously', function() {
    stop();
    define(['something'], function(sth) {
        ok(sth, 'Something loaded');
        start();
    });
});
Run Code Online (Sandbox Code Playgroud)

摩卡

摩卡的作用非常相似:

/*globals mocha */
mocha.setup('bdd');

require([ 'test/mocha/test.js' ], function() {
    mocha.run();
});
Run Code Online (Sandbox Code Playgroud)

通过声明一个参数作为规范的回调,异步测试甚至更好:

describe('an async something', function() {
    it('loads the dependency', function(done) {
        define(['something'], function(sth) {
            ok(sth, 'Something loaded');
            done();
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

这通常应该有效.有一点要记住,如果使用RequireJS加载测试文件,测试可能并不总是以相同的顺序运行.