Javascript 我如何模拟一个';超时';或';失败';使用Sinon/Qunit进行响应?
我在整理模拟成功条件方面没有问题,但似乎无法理解在使用Sinon和Qunit测试和ajax功能时如何模拟失败/超时条件: 我的设置如下: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 = [
$(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属性。