使用JsTestDriver + RequireJS + QUnit进行测试

时间:2012-09-23 18:44:29

标签: requirejs qunit js-test-driver

经过大量的搜索和相当多的试验,在我看来,所选择的组合 工具只是没有它。我很想错。

嗯,技术堆栈如标题中所述。要扩展,

  1. 所有“班级”的骨干
  2. RequireJS加载和管理Backbone实体之间的依赖关系
  3. QUnit(测试也是RequireJS模块)
  4. 用于命令行自动化的JsTestDriver
  5. 设置和代码段

    jsTestDriver.conf

    server: http://localhost:48080
    basepath: path/to/JSTestDriver/
    load:
      - lib/qunit/qunit-1.10.0.js
      - lib/qunit/equiv.js
      - lib/qunit/QUnitAdapter.js
      - lib/requirejs/require.js
    test:
      - test/tests.js
    serve:
      - lib/jquery/jquery-1.7.1.js
      - test/components/ComponentOneTest.js
    

    tests.js

    require({  
        baseUrl : '/test',
        shim : {
            'fixture.object' : ['jquery'],
            'fixture.string' : ['jquery'],
            'fixture.dom' : ['jquery', 'fixture.string'],
            'fixtures' : ['fixture.object', 'fixture.string', 'fixture.dom'],
            'equiv' : ['qunit'],
            'qunit.adapter' : ['qunit', 'equiv']
        },
        paths: {  
            'text' : 'lib/requirejs/text',
            'jquery' : 'lib/jquery/jquery-1.7.1',
            'backbone' : 'lib/backbone/amd/backbone',
            'underscore' : 'lib/underscore/amd/underscore',
            'fixture.dom' : 'lib/fixture/jquery.dom.fixture',
            'fixture.string' : 'lib/fixture/jquery.lang.string',
            'fixture.object' : 'lib/fixture/jquery.lang.object',
            'fixtures' : 'fixture/fixtures',
            'qunit' : 'lib/qunit/qunit-1.10.0',
            'equiv' : 'lib/qunit/equiv',
            'qunit.adapter' : 'lib/qunit/QUnitAdapter'
        }
    }, [], function() {
        module('Module 1', {});
    
        test('test 1', 1, function() {
            ok(true, 'passed');
        });
    
        asyncTest('test 2', 1, function() {
            start();
            ok(true, 'passed');
    
        });
    });
    

    服务器启动命令(来自JSTD JAR所在的同一目录)

    java -jar JsTestDriver-1.3.4.b.jar --port 48080
    

    测试运行命令(来自JSTD JAR所在的同一目录)

    java -jar JsTestDriver-1.3.4.b.jar --runnerMode PROFILE --reset --dryRunFor all --tests all
    

    什么有效?

    第一个同步测试。

    哪些不起作用?

    第二个异步测试不起作用并超时。

    错误

    Chrome控制台

    Uncaught TypeError: Cannot read property 'all' of undefined qunit-1.10.0.js:1102
    done qunit-1.10.0.js:1102
    process qunit-1.10.0.js:1285
    (anonymous function) qunit-1.10.0.js:383
    

    控制台

    setting runnermode PROFILE
    Chrome: Reset
    Chrome: Reset
    Chrome 22.0.1229.64: 1 tests [
    Module 1 (/test/test/tests.js)
            test test 1
            test test 2]
    .F
    Total 2 tests (Passed: 1; Fails: 1; Errors: 0) (30025.00 ms)
      Chrome 22.0.1229.64 Windows: Run 2 tests (Passed: 1; Fails: 1; Errors 0) (30025.00 ms)
        Module 1.test test 2 failed (30023.00 ms): Error: Callback '#1' expired after 30000 ms during test step 'start()'
          Error: Callback '#1' expired after 30000 ms during test step 'start()'
    
    Sep 23, 2012 8:36:44 PM com.google.jstestdriver.ActionRunner runActions
    INFO:
    

    备注

    我确实从here下载了最新的QUnit适配器。我还尝试了一堆其他的,应该工作的适配器无济于事。

    问题

    这甚至可能吗?如果是这样,有人会对这个问题有所了解吗?

    谢谢。

    更新(08.04.14)

    Karma。就是这样。

1 个答案:

答案 0 :(得分:2)

在异步测试中,一个接一个地放置一组简单的语句是没有意义的。如果我们不想在测试中执行时间任务(例如超时或ajax调用)时停止并启动测试,则主要使用异步测试。为了模仿这个,我们可以改变

asyncTest('test 2', 1, function() {
    start();
    ok(true, 'passed');
});

asyncTest('test 2', 1, function() {        
    setTimeout(function(){
        ok(true, 'passed');
        start();
    },2000);    
});

这将像魅力一样工作!!!