2012-09-23 31 views
3

经过大量的搜索和相当多的试用,在我看来, 工具的选择组合并没有它。我很想去误会。使用JsTestDriver + RequireJS + QUnit测试

那么,技术堆栈正如标题中所述。要扩大,

  1. 骨干,为所有 “类”
  2. RequireJS加载和骨干实体之间的管理依赖性
  3. QUnit(其中测试也RequireJS模块)
  4. JsTestDriver命令行自动化

设置和代码片段

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 

试验运行命令(来自同一目录JST d JAR是)

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

什么工作?

第一个同步测试呢。

什么不行?

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

错误

铬控制台

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适配器。我也尝试了一些其他的,据说工作,适配器无济于事。

问题

这甚至可能吗?如果是这样,那么有人会如此善待澄清这个问题?

谢谢。

UPDATE(14年4月8日)

Karma。就这些。

+0

自从您发布此问题已经有一段时间了 - Dilip的建议是否解决了您的问题,或者您是否提出了其他问题?只是好奇,我处于类似的情况。 – mrk

+0

没有。没有运气。 然而,在我的另一个项目中,我决定使用Grunt和Phantom.JS进行QUnits,到目前为止工作正常。 – ZenMaster

回答

2

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

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

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

将工作就像一个魅力!

+1

重要或不重要是一个诗歌的问题。 QUnit允许它OOB和它的工作。 无论如何,即使有您的建议,上述设置也存在严重的稳定性问题。 您是否有在上面运行堆栈的实际经验? – ZenMaster

+0

其实我在我的测试用例中遇到了同样的问题。一旦我把它放到setTimeout中,如我的代码所示,它就起作用了。 – Dilip

+0

嗯。我其实是做了你以前的建议。结果是运行'runningMode PROFILE'的测试完全跳过了测试,'runningMode DEBUG'有时可以正常工作,有时会失败。如果你可以分享你的设置和配置,我会接受答案。 – ZenMaster