2013-03-28 31 views
1

使用qUnit,如果在测试中有异步代码,我知道如何使用asyncTest(),但是如果您有一个包含异步代码的函数呢?测试包含异步代码的函数

换句话说,异步请求不在测试范围内,而仅仅是正在测试的代码的一部分。

就拿这个代码:

function makeAjaxCall(){ 
    $.get('/mypage', {}, function(data){ 
     // Do something with `data` 
    },'json'); 
} 

我怎么能说一个测试中makeAjaxCall(),然后运行对从Ajax请求返回的data测试?

回答

1

在这种情况下,您可以使用jQuery Global Ajax Event Handlers。在调用之前绑定它,在完成测试后解除绑定,可能通过Qunit中的模块方法。

喜欢的东西(未经测试):

asyncTest(function() { 
    expect(1); 

    $(document).ajaxSuccess(function(e, xhr, settings) { 
    var jsonRep = JSON.parse(xhr.responseText); 
    // assert on jsonRep 
    //ok(true); 
    }); 
    $(document).ajaxError(function(e) { 
    ok(false); 
    }); 
    $(document).ajaxComplete(function() { 
    start(); 

    $(document).unbind('ajaxSuccess ajaxError ajaxComplete'); 
    }); 

    makeAjaxCall(); 
}); 

注意的是,全球处理器do not have access to the parsed contents,你必须使用JSON.parse自己重新分析他们。不理想,但我不知道另一种方式。

+0

这个答案似乎应该工作,但如果异步事件不是ajax请求呢?我唯一的选择是否会从回调中手动进行事件触发? – twiz 2013-03-28 04:34:58

+0

我这么认为。你需要在异步进程中有一些钩子并确定它已经完成。我不知道任何JavaScript构造都可以为每种类型的异步操作执行此操作。您可以通过重写实现并在幕后执行一些魔术来显然创建自己的像window.setTimeout这样的众所周知的实例,但可以说更容易进行回调。 $ .Deferred可以帮助实现清洁。 – syazdani 2013-03-28 13:50:43

0

似乎没人关心mockAjax,所以我最近发现了更好的东西:sinonJS! 你知道这个奇妙的工具Fiddler的功能autoResponse吗?sinonJS允许您在客户端执行相同的操作,它是一种ajax旁路代理。 如果你有兴趣看到一个例子,让我知道 ...所以sinonJS可以在不访问服务器的情况下响应任何ajax请求,如果你想模拟你的客户端,如果你想单元测试你的javascript码。