【问题标题】:Testing using JsTestDriver + RequireJS + QUnit使用 JsTestDriver + RequireJS + QUnit 进行测试
【发布时间】:2012-09-23 18:44:28
【问题描述】:

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

嗯,技术栈如标题中所述。展开,

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

设置和编码 sn-ps

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。就是这样。

【问题讨论】:

  • 您已经有一段时间没有发布这个问题了——Dilip 的建议是否解决了您的问题,还是您提出了其他问题?只是好奇,我也有类似的情况。
  • 不。没运气。然而,在我的另一个项目中,我决定将 Grunt 和 Phantom.JS 用于 QUnits,到目前为止它运行良好。

标签: requirejs qunit js-test-driver


【解决方案1】:

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

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

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

它会像一个魅力一样工作!!!

【讨论】:

  • 是否有意义有点像诗歌问题。 QUnit 允许它OOB 并且它可以工作。无论如何,即使有您的建议,上述设置也存在严重的稳定性问题。你有实际运行上述堆栈的经验吗?
  • 实际上,在我的测试用例中,我在相同的设置下遇到了同样的问题。一旦我按照我的代码所示将它放入 setTimeout 中,它就起作用了。
  • 嗯。我确实按照你之前的建议做了。结果是使用runningMode PROFILE 运行完全跳过了测试,runningMode DEBUG 有时工作,有时失败。如果您可以分享您的设置和配置,我会接受答案。
  • 这是我用来运行测试用例的配置: --port 42442 --config JsTestDriver.conf --browserTimeout 20 --server localhost:42442 --browser "C:\Program Files \Internet Explorer\iexplore.exe" --tests all --runnerMode DEBUG
  • 我的意思是包含 jsTestDriver.conf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多