【问题标题】:How do I mock a 'timeout' or 'failure' response using Sinon / Qunit?如何使用 Sinon / Qunit 模拟“超时”或“失败”响应?
【发布时间】:2013-05-09 18:07:10
【问题描述】:

我在整理模拟成功条件时没有问题,但似乎无法理解在使用 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);

但它不起作用。

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

【问题讨论】:

  • 超时是在给定时间内没有响应,所以不能返回超时
  • 我希望 sinon 能够克服这一点,并为所有类型的响应提供标准化接口。如果我不能使用 sinon '返回'超时 - 那么我如何伪造一个?
  • 我不知道 sinon 所以可能有一些特定的东西,但通常你将超时设置为 1ms,并在服务器或模拟服务器端使用等待。
  • 好主意-我会尝试超时方法,但是失败方法呢,标准的sinon方法是什么?

标签: javascript unit-testing jquery qunit sinon


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    做这样的事情

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

    用于触发 jQuery AJAX 请求中的“错误”回调。

    至于超时,你可以像这样使用 sinons fake clock:

    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');
    });
    

    【讨论】:

    • 也许是 jQuery 的 Ajax 的方式,但 CJ 询问的是 sinon 的假 XHR;这些方法都不适用于 sinon。
    【解决方案3】:

    在您的 $.ajax() 呼叫上设置超时,并使用 Sinon fake timers 将时钟提前,然后再响应。

    【讨论】:

    • CJ 没有进行 $.ajax() 调用,但是 sinon 假 XHR 调用并且 sinon 不支持 .timeout 属性。
    猜你喜欢
    • 2017-10-08
    • 2015-06-26
    • 1970-01-01
    • 2015-08-04
    • 2013-08-15
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多