1

我将 sinon js 的假服务器与 Jasmine 一起用于 UT/IT。我已经设置了 server.autorespond = true。(即使在减少 server.autoRespondAfter 中的 ms 后也进行检查)

问题:服务器响应请求后不会触发回调(我可以检查服务器请求的日志和服务器对象本身以查看响应文本)。Jasmine 检查成功或失败 callback.CalledOnce 失败。

在以下情况下不会发生此问题:我在设置 server.respondWith(..) 后使用 server.respond() 并且在服务器响应后正确触发了我的回调。Jasmine 通过了成功或失败回调的检查。CalledOnce。

我的理解是自动响应使服务器在收到异步请求时自动响应,包括调用适当的回调?我还需要使用 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

在我的茉莉花规格中,我有

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();
4

2 回答 2

2

我知道这是一个旧线程,但我想我会为 googlers 更新:

Sinon 文档指出autoRespond不适合测试,因为它将异步执行。这默认为 10 毫秒后,这足以碰撞到下一个执行帧,可能会导致测试出现一些竞争条件。我发现这一点是因为我有类似的与 AJAX 相关的失败测试用例。

我最终respondImmediately在 fakeServer 上实现了一个属性,它将同步响应任何请求。几周前它刚刚合并到项目中(v1.14.0),但如果你更新到最新版本,你应该能够得到它。在这里查看文档。

不要将this.server.autoRespond属性设置为 true,而是将属性设置this.server.respondImmediately为 true。此时,不需要任何this.server.respond()调用。

于 2015-04-01T01:06:44.830 回答
0

jQuery.ajax 是异步的...除非您在调用 expect() 之前等待足够长的时间,否则您的测试用例将失败。或者,您可以通过设置使 .ajax 同步,jQuery.ajax({ url: '/abc', async: false, success: callbacks[0] });尽管这不适用于某些类型的请求(如跨域)...有关详细信息,请参阅 jquery API 文档

于 2012-07-03T04:44:15.197 回答