如何使用Sinon / Qunit模拟“超时”或“失败”响应?

时间:2013-05-15 08:41:29

标签: javascript unit-testing jquery qunit sinon

我在整理模拟成功条件时没有遇到任何问题,但似乎无法理解在使用Sinon和Qunit测试和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调用处理程序'听到'失败或超时方法?我唯一能想到的就是:

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

但它不起作用。

我做错了什么或者我误解了什么?所有人都非常感谢:)

3 个答案:

答案 0 :(得分:0)

对于超时,sinon的fake timers可以提供帮助。使用它们,您不需要将超时设置为1毫秒。至于失败,你对我的态度looks correct。你能给我们更多的代码,尤其是失败处理程序吗?

答案 1 :(得分: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');
});

答案 2 :(得分:-1)

$.ajax()来电时设置超时,并使用Sinon fake timers在响应前提前移动时钟。