4

QUnitとMockjaxを使用してjQueryajaxコードをテストし、次のように、テストごとに異なるJSONを返すようにしています。

$(document).ready(function() {

function functionToTest() {
    return $.getJSON('/echo/json/', {
        json: JSON.stringify({
            "won't": "run"
        })
    });
}

module("first");

test("first test", function() {

    stop();

    $.mockjax({
        url: '/echo/json/',
        responseText: JSON.stringify({
            hello: 'HEYO!'
        })
    });

    functionToTest().done(function(json) {
        ok(true, json.hello);
        start();
    });               
});


 test("second test", function() {

    stop();

    $.mockjax({
        url: '/echo/json/',
        responseText: JSON.stringify({
            hello: 'HELL NO!'
        })
    });


    functionToTest().done(function(json) {
        ok(true, json.hello);
        start();
    });


});

});

残念ながら、呼び出しごとに同じ応答が返され、順序は保証されないため、実際の要求に結合してこれを思い付くように設定するにはどうすればよいか疑問に思いまし

$.mockjax({
    url: '/echo/json/',
    response: function(settings) {

        if (JSON.parse(settings.data.json).order === 1) {
            this.responseText = JSON.stringify({
                hello: 'HEYO!'
            });
        } else {
            this.responseText = JSON.stringify({
                hello: 'HELL NO!'
            });
        }
    }
});

これはサーバーに送信されるパラメーターに依存しますが、パラメーターのないリクエストについてはどうでしょうか。それでも、さまざまな応答をテストする必要があります。QUnitのセットアップ/ティアダウンを使用してこれを行う方法はありますか?

4

1 に答える 1

3

$.mockjaxClear();別のモックハンドラーを作成する前に呼び出す必要があるようです。

Mockjaxは、$。ajaxメソッドを変更することで機能します。

ソースコードの下部に、公開されているメソッドの1つである$ .mockjaxメソッドが、mockHandlers配列にハンドラーを追加していることがわかります。

    $.mockjax = function(settings) {
        var i = mockHandlers.length;
        mockHandlers[i] = settings;
        return i;
    };

$ .ajax置換のソースコードでは、次のことがわかります。

    // Iterate over our mock handlers (in registration order) until we find
    // one that is willing to intercept the request
    for(var k = 0; k < mockHandlers.length; k++) {

問題は、$。ajaxメソッドが/echo/json/URLの配列内の最初のハンドラー(したがって最新ではない)のモックハンドラーで満たされていることが原因です。

これが私のフィドルのフォークです。行を追加するだけ$.mockjaxClear()です。


編集:

より柔軟なソリューション:

  • テスト関数の外では、後で変更するためにリクエストハンドラーのIDを持つ変数をデケアします。
  • 特定のハンドラーをオーバーライドする必要があるモジュールの前に、変更するハンドラーのバックアップを保持するための変数(初期値は不要)を宣言します。
  • 次に、モジュールセットアップ関数で$ .extendを使用して、設定を$ .mockjax.handler(<your handlerID variable>)からこのバックアップにコピーします。モジュールの分解で、$。mockjaxClear(<your handlerID variable>)を使用してモジュールを削除してから、別の値に設定<your handlerID variable>します。
  • setupこれで、モジュールおよび個々のテスト関数でハンドラーをオーバーライドできます。

しかし、私の言葉を信じないでください。フィドルをチェックしてください

このようにはるかに柔軟です。その1つのハンドラーを変更して、他のすべてのハンドラーをそのままにしておくことができます。

エラーが発生しやすい可能性があるため、注意することをお勧めします。

于 2012-10-22T13:35:43.660 に答える