2

単体テストの問題をトラブルシューティングしようとしています。

以前はほとんど動作する Maven -> PhantomJS -> Qunit のセットアップがありましたが、予測できなかったため、分解して修正を試みました。

ソフトウェアをアップグレードしました:

Qunit: 1.11.0
PhantomJS: 1.8
Phantom Qunit Runner Latest: https://github.com/jquery/qunit/tree/master/addons/phantomjs

Web GUI が機能していることがわかります。102 のすべてのテストを実行して合格します。コンソールはこれを出力します:

$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ Took 16ms to run 0 tests. 0 passed, 0 failed.

ランナーで exit コマンドをコメントアウトすると、QUnit.done のコンソール出力が複数回出力されます。

$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ PhantomJS successfully loaded a page
$ QUnit.done callback fired
$ Took 15ms to run 0 tests. 0 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1840ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1841ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1842ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1848ms to run 102 tests. 102 passed, 0 failed.
$ ^C
$

Qunit.done コールバックが実行されるのが早すぎて、複数回実行されているように見えます。

そのコールバックが発生する理由を知っている人はいますか?

テストの包含とログインの遅延が関連している可能性があります。AMD モジュールを使用してテストを定義し、curl.js を使用してテストを取り込みます。セキュリティ ログインが行われるまで、何も起こりません。

curl(['dolla'], function($){
        $.ajax({
        type: 'POST',
        url: '/svc/j_spring_security_check',
        data: {
            j_username: '7',
            j_password: '7'
        },
        success: function() {
            loadTests()
        }
    });
})
var loadTests = function () {
    curl([
        // Unit tests
         'dcx/dataControls/activity.test'
        , 'dcx/dataControls/eventList.test'
        , 'dcx/dataControls/mapViewer.view.test'
        , 'dcx/pages/deviceDetails.view.test'
        , 'dcx/pages/login.test'
        , 'dcx/pages/nodeProfiles.test'
        , 'dcx/pages/settings.view.test'
    ], function() {},  function(ex) { throw new Error(ex) })
})

編集:私は根本的な原因に陥っていると思います。空白のページに QUnit を含めると、すぐに QUnit.begin と QUnit.done が呼び出されます。セキュリティ ログインが成功し、curl が単体テストを実行するまで、Qunit の実行を遅らせる必要があります。QUnit の開始を遅らせる方法はありますが、Qunit オブジェクトは引き続き利用可能ですか? start() を呼び出す非同期テストが多数あるため、stop() を使用できません。

4

3 に答える 3

2

答えを見つけました。QUnit を開始しないように構成し、すべてのテストがロードされたときに手動で開始することができます。これにより、この問題の根本原因である Qunit.done の重複呼び出しが防止されます。

http://forum.jquery.com/topic/are-qunit-and-requirejs-compatible#14737000001967123

于 2013-02-28T21:46:46.777 に答える
0

これはそれを行う1つの方法です。テスト結果がない場合に終了しないようにランナーを変更します。 https://gist.github.com/SimpleAsCouldBe/5059623

ただし、これは機能しません。テストスタックがクリアされるたびにQunit.doneが起動します。Curl / Require.jsのような非同期でロードされる環境では、これはいつでも発生する可能性があります。

于 2013-02-28T20:03:51.117 に答える