使用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插件的在线文档。
答案 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");