2

在使用 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() 上的任何间谍选项,这可以更简单吗?

谢谢,

礼萨

4

0 回答 0