2012-09-23 111 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