2

backbone.js アプリケーションの単体テストのためにQUnitrequire.jsと組み合わせて使用​​しています。asyncTestメソッドを使用して、すべてのテストは非同期です。

私はsetupandを使用して、各テストのフィクスチャteardown構築および削除しています。私の問題は、asyncTestブロックしているように見えますがsetup()、開始前に各テストで呼び出され、ほぼすべてのsetup()呼び出しが同時に実行されることです。この解決策は私の問題を解決していないようです。以下に、モジュールのセットアップ方法の例を示します。問題を説明するテスト リポジトリへのリンクを次に示します。

私の質問は: 私は何か間違ったことをしていますか、それともこの QUnit の通常の動作ですか?

module('Module', {
    setup: function(){
        console.log('setup');
    },
    teardown: function(){
        console.log('teardown');
    }
})

asyncTest('Test 1', function() {
    setTimeout(function(){
        equal(2, 2, 'The return should be 2.');
        start();
    }, 400);
});

asyncTest('Test 2', function() {
    setTimeout(function(){
        equal(1, 1, 'The return should be 1.');
        start();
    }, 400);
});
4

2 に答える 2

6

QUnit はかなり特殊なページ読み込み動作を想定しています。requirejs を介してロードすると、機能しているように見えるかもしれませんが、実際には機能しません。通常のスクリプト タグを使用して QUnit をロードすることをお勧めします。を設定している限り、requirejs を介してテスト自体を読み込むことは問題ありQUnit.config.autostart = falseません。

于 2013-06-17T10:42:32.840 に答える
0

Jörn Zaeffererが上記で指定したソリューションを含むブログ投稿- http://www.jonnyreeves.co.uk/2012/qunit-and-requirejs/

これが私が実装したものです-

私が抱えていた問題:

私はrequire経由でqunitを含めました。これは、すべての同期テストでうまくいくようです。qunit モジュールのセットアップで変数を定義していて、ティアダウンで null に戻りました。asyncTest を含めたとき、ティアダウンによって適切にリセットされていないように見えたため、新しい変数を期待するテストの後に実行されたすべてのテストが壊れていました。

キーポイント

  • 独自の script タグを介して qunit を含める
  • 自動開始を false に設定する
  • すべてのテスト モジュールが必要になったら、もう一度開始します

おそらく最もエレガントではありませんが、エンドツーエンドの例にも出くわしませんでした。この答えを見つけるのに数時間かかりました(最初に asyncTest の設定が間違っていると思ったからです)。

<link rel="stylesheet" href="qunit-1.12.0.css">
<script type="text/javascript" src="qunit-1.12.0.js"></script>
<script>
    QUnit.config.autostart = false
    require(['App'],
    function(){

        //Modules that have been loaded in by require.js
        var loadedModules = [];

        //Locations of test modules to load
        var moduleLocations = [
            'tests/test1',
            'tests/test2',
            'tests/test3'
        ];

        //If all modules have been loaded, run them
        function runTests(){
            if (loadedModules.length == moduleLocations.length){
                QUnit.start();
                _.each(loadedModules,function(test){
                    test();
                });
            }
        }

        _.each(moduleLocations,function(string){
            require([string],
            function(a){
                loadedModules.push(a);
                runTests();
            });
        });

    });
</script>

個別のテスト モジュール ファイル:

define(['array','of','test','requirements'], function() {

    return function(){

        var options = null;

        module('Autocomplete',{
            setup: function() {
                // prepare something for all following tests
                options = new whatever();
            },
            teardown: function() {
                // clean up after each test
                options = null;
            }
        });

        test( "normal tests", function() {
            ok(true,"normal assertions");
        });
    }
});
于 2014-01-04T00:03:12.273 に答える