在使用 Jasmine 对 jQuery AJAX 调用进行单元测试时,我通常可以在将选项传递给 $.ajax() 函数之前监视成功函数(网络和这个论坛上有很多例子)。
但是这次我遇到了一个特殊的问题。发送到 $.ajax 的选项深深地隐藏在 jQuery 插件中并由复杂的逻辑创建,而我获得成功函数的唯一方法是监视 $.ajax 本身并调用假函数。
但是现在我有了选项,我不能再调用 $.ajax 函数了。因此,经过大量的网络搜索和 API 文档阅读后,我终于想出了从服务器返回的数据:
it('is going to steal the data returned from the server by ajax',function(){
var ajaxspy=spyOn($,'ajax');
ajaxspy.andCallFake(function(options){
ajaxspy.mysterious_options=options;
});
$(myelement).myjQueryPlugin(my_method_which_will_call_ajax_eventually);
spyOn(ajaxspy.mysterious_options,'success').andCallFake(function(data){
ajaxspy.stolen_data=data;
});
ajaxspy.andCallThrough();
ajaxspy.plan(ajaxspy.mysterious_options);
waitsFor(function(){
return ajaxspy.stolen_data;
})
runs(function(){
expect(data).toHaveSomeProperties();
})
}
鉴于在调用 $.ajax 之前无法拦截 options.success() 上的任何间谍选项,这可以更简单吗?
谢谢,
礼萨