使用Jasmine在JS中测试AJAX调用时,.andReturn(...)和.respondWith(...)之间有什么区别?

时间:2016-05-02 22:22:29

标签: javascript ajax unit-testing jasmine

使用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请求是针对网址my/url,那么这两者之间还有什么不同?

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

1 个答案:

答案 0 :(得分:1)

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

  • class StudentController extends Controller { public function __construct() { $this->middleware('auth'); } public function store(StudentRequest $request) { $student = Student::create($request->all()); $student->id_no = "12345669"; $student->save(); return redirect('index'); } } 现在发送对过去未接听的ajax电话的回复,
  • respondWith建立一个响应,在未来的ajax呼叫发送后立即发送。

在以下2个示例中,验证andReturn处理程序中的回调是否显示是否已返回对ajax调用的响应,因为这样的响应将触发回调。方法#1中,ajax调用已发送,但在调用onreadystatechange之前仍未得到答复。在方法#2中,响应是预先设置的,一旦发送ajax调用,就会返回响应。

方法#1:

respondWith

方法#2:

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