我正在使用sinon js的假服务器和Jasmine用于UT / IT。我已经设置了server.autorespond = true。 (甚至在减少server.autoRespondAfter中的ms后检查)
问题:服务器响应请求后不会触发回调(我可以检查服务器请求的日志和服务器对象本身以查看响应文本)。 Jasmine未通过检查成功或失败回调.CalledOnce。
在以下情况下不会发生此问题:我在设置server.respondWith(..)&之后使用了server.respond()。服务器响应后我的回调被正确触发。 Jasmine通过检查成功或失败回调.CalledOnce。
我的理解是autorespond使服务器在收到异步请求时自动响应,包括调用适当的回调?我还需要使用server.respond吗?
感谢。
代码段:阅读所需的json文件&将其作为服务器响应发送。 json文件读取是同步调用(async false)。
this.server = sinon.fakeServer.create();
this.server.autoRespond = true;
sinon.FakeXMLHttpRequest.useFilters = true;
sinon.FakeXMLHttpRequest.addFilter(function (method, url, async, username, password) {
// Don't fake json file read requests
if (url == inputUrl) {
return true;
}
});
this.resultfile = this.readJsonFile(inputUrl);
this.server.respondWith("GET", endUrl,
[200, { "Content-Type": "application/json" }, this.resultfile]);
console.log (this.server.requests); // Logs all requests so far
在我的Jasmine规范中,我有
var callbacks = [sinon.spy(),sinon.spy()];
// call the above sinon code and then make the test call below
jQuery.ajax({
url: '/abc',
success: callbacks[0]
});
// this fails, though I can see the server responded to the request.
expect(callbacks[0].calledOnce).toBeTruthy();
答案 0 :(得分:2)
我知道这是一个旧帖子,但我认为我会为googlers更新:
Sinon文档声明autoRespond
不适合测试,因为它将异步执行。这默认为10ms之后,这足以碰到下一个执行帧,可能会导致测试的某些竞争条件。我发现这是因为我有类似的与AJAX相关的失败测试用例。
我最终在fakeServer上实现了respondImmediately
属性,该属性将同步响应任何请求。这几个星期前刚刚合并到项目中(v1.14.0),但如果你更新到最新版本,你应该能够得到它。 Check out the docs here.
不要将this.server.autoRespond
属性设置为true,而是将this.server.respondImmediately
属性设置为true。此时,无需进行任何this.server.respond()
来电。
答案 1 :(得分:0)
jQuery.ajax是异步的......除非你在调用expect()之前等待足够长的时间,否则你的测试用例将会失败。或者,您可以通过执行jQuery.ajax({ url: '/abc', async: false, success: callbacks[0] });
来设置make .ajax同步,尽管这对某些类型的请求(例如跨域)不起作用...有关详细信息,请参阅jquery API文档