1

qunitmockjaxを使用してフロントエンド コードをテストしています。mockjax 独自のテスト コードでの AJAX テストの構造は次のようになります ( jsfiddle )。

var testURL = "/test/data",
    testData = { a: 1, b: "c" };

asyncTest("AJAX response test", 1, function() {
    $.mockjax({
        url: testURL,
        responseText : JSON.stringify(testData)
    });

    $.ajax({
        url: testURL,
        dataType: "json",
        success: function(data) {
            deepEqual(data, testData, 'AJAX response is OK');
        },
        complete: function() {
            start();
        }
    });

    $.mockjaxClear();
});

mockjaxのドキュメントによると:

* $.mockjaxClear() 
    Removes all mockjax handlers.

私が理解していないのは、呼び出しmockjaxClearの直後に呼び出される理由です$.ajax()。問題は、ドキュメントにあるように、何らかのクリーンアップを行う場合、AJAX 応答が到着する前にこのクリーンアップが実行されることです (この jsfiddleのコンソールを参照してください)。completeイベントのハンドラーでクリーンアップを行う方が論理的に思えます。後に mockjaxClear を呼び出す方が良い理由を誰かに説明してもらえます$.ajax()か?

4

2 に答える 2

3

コードを見ると、クリーンアップが既に「実行中」の呼び出しに影響しないことがわかります。後続のすべて$.ajax()が jQuery の元のメソッドを呼び出し、他の内部状態 (ただし、保留中の「要求」には影響しません) が消去されることを確認するだけです。

これにより、$.ajax()テスト中の呼び出し test が 1 回だけ送信されるようにすることができます (複数回送信すると失敗し、さらにstart()メソッドが再度呼び出され、エラーが Qunit に報告されます)。

コードをきれいに保つためだけにこの方法を使用することもできます (コールバック ハンドラー内のものを減らします)。

于 2013-09-13T13:32:50.520 に答える
2

$.mockjaxClear実際にテストのどこでも実行する必要はないと思います。QUnit は、モジュール内で実行されるテストのライフサイクル フックを提供します。この場合、重要なのは分解です。

http://api.qunitjs.com/module/

それを使用すると、コードは次のようになります

module( "myapi", {
    teardown: function() {
        $.mockjaxClear();
    }
});

asyncTest( "sometest", function() {
    // test definition
});

必要に応じて、モック セットアップをsetupライフサイクル フックに移動して、実際のテスト コードをよりコンパクトにし、セットアップ/ティアダウンではなく、テスト自体に集中することもできます。

于 2013-09-16T04:59:02.800 に答える