Sinon JS假服务器autorespond用法

时间:2012-07-03 03:54:50

标签: jasmine sinon

我正在使用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();

2 个答案:

答案 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文档