Javascript 我如何模拟一个';超时';或';失败';使用Sinon/Qunit进行响应?

Javascript 我如何模拟一个';超时';或';失败';使用Sinon/Qunit进行响应?,javascript,unit-testing,jquery,qunit,sinon,Javascript,Unit Testing,Jquery,Qunit,Sinon,我在整理模拟成功条件方面没有问题,但似乎无法理解在使用Sinon和Qunit测试和ajax功能时如何模拟失败/超时条件: 我的设置如下: $(document).ready( function() { module( "myTests", { setup: function() { xhr = sinon.sandbox.useFakeXMLHttpRequest(); xhr.requests = [

我在整理模拟成功条件方面没有问题,但似乎无法理解在使用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(“数据获取方法对接收数据做出正确反应”,
函数(){
sinon.spy(MyObject.prototype,“ajaxSuccess”);
MyObject.prototype.fetchData();
//检查是否有人听到电话
相等(1,xhr.requests.length);
//返回该obj的成功方法
xhr.requests[0]。响应(200{
“内容类型”:“应用程序/json”
},
“[{”responseData:“一些测试数据”}]”
);
//检查是否调用了正确的成功方法
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);
但它不起作用


我做错了什么,或者我误解了什么?非常感谢大家的帮助:)

对于暂停时间,西农可以提供帮助。使用它们,您不需要将超时设置为1ms。至于失败,你对我的态度。你能给我们更多的代码,特别是故障处理程序吗?

这样做

requests[0].respond(
        404,
        {
            'Content-Type': 'text/plain',
            'Content-Length': 14
        },
        'File not found'
);
用于在jQueryAjax请求中触发“error”回调

至于超时,您可以使用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');
});

设置通话超时,并在响应前使用Sinon将时钟提前。

超时是指在给定时间内没有响应,因此您无法返回超时。我希望Sinon能够克服这一问题,并为所有类型的响应提供标准化接口。如果我不能使用sinon“返回”超时-那么我如何伪造超时?我不知道sinon,所以可能有一些特定的东西,但通常你会将超时设置为1ms,并使用服务器上的等待或模拟服务器端。好主意-我会尝试超时方法,但失败方法如何,标准的sinon方法是什么?也许是jQuery的Ajax的方法,但是CJ询问sinon的伪XHR;这两种方法都不适用于sinon。CJ没有进行$.ajax()调用,但是sinon伪XHR调用,并且sinon不支持.timeout属性。