使用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");