1

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

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

以这段代码为例:

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

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

4

2 回答 2

1

在这种情况下,您可以使用jQuery Global 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 重新解析它们。不理想,但我不知道另一种方式。

于 2013-03-28T03:26:44.567 回答
0

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

于 2013-04-08T16:15:46.150 回答