使用jasmine-ajax库测试JavaScript代码时,我可以模拟ajax响应。特别是,我可以定义将给特定的ajax请求的响应。似乎有(至少)两种不同的方法可以这样做:

方法1:

jasmine.Ajax.requests.mostRecent().respondWith({
  status: 200,
  contentType: 'text/plain',
  responseText: 'my response'
});

方法2:
jasmine.Ajax.stubRequest('my/url').andReturn({
  'responseText': 'my response'
});

如果我的mostRecent请求是URL my/url,那么这两者之间还有什么区别?

我在ME TroSTLer的“JavaScript单元测试”视频系列中已经对这两种方法进行了介绍,但是在这些视频中,搜索StackOverflow或Jasmine的在线Jasmine在线文档中找不到我的问题的明确答案。它的ajax.js插件。

最佳答案

我自己进一步研究之后,我相信这两个命令之间的差异至少部分在于模拟ajax调用的响应时间。简而言之:

  • respondWith现在发送对过去未应答的ajax调用的响应
  • andReturn建立响应,该响应将在将来发送ajax调用时立即发送。

  • 在以下两个示例中,验证onreadystatechange处理程序中的回调是否显示了已返回对ajax调用的响应,因为这样的响应将触发该回调。在方法#1中,发送了ajax调用,但是直到respondWith被调用之前一直没有应答。在方法2中,预先设置了响应,以便一旦发送了ajax调用,就会返回响应。

    方法1:
    setUpAndSendAjaxCall1();
    expect(onreadystatechangeCallback1).not.toHaveBeenCalled();
    jasmine.Ajax.requests.mostRecent().respondWith({
      ...
      "responseText": "response #1"
    });
    expect(onreadystatechangeCallback1).toHaveBeenCalledWith("response #1");
    

    方法2:
    jasmine.Ajax.stubRequest(myUrl).andReturn({
      ...
      "responseTest": "response #2"
    });
    setUpAndSendAjaxCall2();
    expect(onreadystatechangeCallback2).toHaveBeenCalledWith("response #2");
    

    07-24 19:24
    查看更多