对于测试包含异步代码的函数(Testing for a function that contains

2019-10-17 21:57发布

随着qUnit,我知道如何使用asyncTest()你的测试中,如果你有异步代码,但如果你有一个包含异步代码的功能?

换言之,异步请求不是测试中,但仅仅是正被测试的代码的一部分。

举个例子的代码:

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

我怎么能叫makeAjaxCall()的测试中,然后运行该测试data是从Ajax请求返回?

Answer 1:

您可以使用jQuery的全局AJAX事件处理这种情况。 打电话之前将其绑定,解除绑定,一旦你完成测试,可能是通过在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();
});

需要注意的是,全球处理器没有访问解析的内容 ,你必须使用JSON.parse自己重新分析他们。 不理想,但我不知道的另一种方式。



Answer 2:

似乎没有人关心mockAjax ,所以我找到了更好的东西,这些天: sinonJS ! 你知道这个名为奇妙的工具的功能,自动回复提琴手 ? sinonJS允许你做在客户端一样,它是一种AJAX旁路代理。 如果你有兴趣看到一个例子,让我知道 ......所以sinonJS可以在不访问服务器的任何响应Ajax请求,这是一种魔法,如果你想戏弄你的客户,如果你想进行单元测试JavaScript代码。



文章来源: Testing for a function that contains asynchronous code