24

成功条件のモックを整理するのに問題はありませんでしたが、SinonQunitを使用してテストと ajax 関数を使用するときに、失敗/タイムアウト条件をモックする方法を理解できないようです。

私のセットアップはこれです:

$(document).ready( function() {

    module( "myTests", {
        setup: function() {
            xhr = sinon.sandbox.useFakeXMLHttpRequest();
            xhr.requests = [];
            xhr.onCreate = function (request) {
                xhr.requests.push(request);
            };

            myObj = new MyObj("#elemSelector");
        },
        teardown: function() {
            myObj.destroy();
            xhr.restore();
        }
    });
});

そして、私の成功例のテストは、うまく実行され、受信したデータを成功メソッドに受信/通過させるのは次のとおりです。

test("The data fetch method reacts correctly to receiving data",
    function () {
        sinon.spy(MyObject.prototype, "ajaxSuccess");

        MyObject.prototype.fetchData();

        //check a call got heard
        equal(1, xhr.requests.length);

        //return a success method for that obj
        xhr.requests[0].respond(200, {
                "Content-Type": "application/json"
            },
            '[{ "responseData": "some test data" }]'
        );
        //check the correct success method was called
        ok(MyObj.prototype.ajaxSuccess.calledOnce);

        MyObj.prototype.ajaxSuccess.restore();
    }
);

ただし、これの代わりに何を入れるべきかわかりません。

xhr.requests[0].respond(200, { "Content-Type": "application/json" },
                '[{ "responseData": "some test data" }]');

私のajaxコールハンドラーhearを失敗またはタイムアウトメソッドにするには? 私が試してみようと思った唯一のことはこれでした:

xhr.requests[0].respond(408);

しかし、うまくいきません。

私は何を間違っていますか、または何を誤解していますか? すべての助けに感謝します:)

4

3 に答える 3

0

このようなことをする

requests[0].respond(
        404,
        {
            'Content-Type': 'text/plain',
            'Content-Length': 14
        },
        'File not found'
);

jQuery AJAX リクエストで「エラー」コールバックをトリガーするように機能します。

タイムアウトに関しては、次のように sinons の偽の時計を使用できます。

test('timeout-test', function() {
    var clock = sinon.useFakeTimers();
    var errorCallback = sinon.spy();

    jQuery.ajax({
        url: '/foobar.php',
        data: 'some data',
        error: errorCallback,
        timeout: 20000 // 20 seconds
    });

    // Advance 19 seconds in time
    clock.tick(19000);

    strictEqual(errorCallback.callCount, 0, 'error callback was not called before timeout');

    // Advance another 2 seconds in time
    clock.tick(2000);

    strictEqual(errorCallback.callCount, 1, 'error callback was called once after timeout');
});
于 2014-02-07T13:12:26.067 に答える
0

タイムアウトについては、シノンの偽のタイマーが役立ちます。それらを使用すると、タイムアウトを 1ms に設定する必要はありません。失敗に関しては、あなたのアプローチは私には正しいように見えます。より多くのコード、特に障害ハンドラーを教えていただけますか?

于 2013-05-30T08:59:13.277 に答える
-1

$.ajax()呼び出しにタイムアウトを設定し、Sinonフェイク タイマーを使用して、応答する前に時計を進めます。

于 2014-02-25T16:54:47.500 に答える