测试包含异步代码的函数

时间:2013-03-28 03:08:03

标签: javascript unit-testing asynchronous qunit

使用qUnit,如果你的测试中有异步代码,我理解如何使用asyncTest(),但如果你有一个包含异步代码的函数怎么办?

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

以此代码为例:

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

如何在测试中调用makeAjaxCall(),然后对从ajax请求返回的data运行测试?

2 个答案:

答案 0 :(得分: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自行重新解析它们。不理想,但我不知道另一种方式。

答案 1 :(得分:0)

似乎没有人关心mockAjax,所以这些天我发现了更好的东西: sinonJS ! 你知道这个名为 Fiddler 的精彩工具的功能autoResponse吗? sinonJS允许你在客户端做同样的事情,它是一种ajax旁路代理。 如果你有兴趣看一个例子,请告诉我 ...所以sinonJS可以在不访问服务器的情况下响应任何ajax请求,如果你想嘲笑你的客户端,这是一种魔力,如果你想单元测试你的javascript代码。