Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试包含异步代码的函数_Javascript_Unit Testing_Asynchronous_Qunit - Fatal编程技术网

Javascript 测试包含异步代码的函数

Javascript 测试包含异步代码的函数,javascript,unit-testing,asynchronous,qunit,Javascript,Unit Testing,Asynchronous,Qunit,有了qUnit,我知道如果测试中有异步代码,如何使用asyncTest(),但是如果有一个包含异步代码的函数呢 换句话说,异步请求不在测试中,而只是被测试代码的一部分 以这段代码为例: function makeAjaxCall(){ $.get('/mypage', {}, function(data){ // Do something with `data` },'json'); } 如何在测试中调用makeAjaxCall(),然后对从ajax请求返回的数

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

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

以这段代码为例:

function makeAjaxCall(){
    $.get('/mypage', {}, function(data){
        // Do something with `data`
    },'json');
}
如何在测试中调用
makeAjaxCall()
,然后对从ajax请求返回的
数据运行测试?

在这种情况下,可以使用。在调用之前绑定它,在完成测试后解除绑定,可能通过Qunit中的module方法

类似于(未经测试):

请注意,全局处理程序,您必须自己使用JSON.parse重新分析它们。不太理想,但我不知道另一种方法。

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

类似于(未经测试):


请注意,全局处理程序,您必须自己使用JSON.parse重新分析它们。不太理想,但我不知道另一种方法。

似乎没有人关心,所以这些天我找到了更好的方法:! 你知道这个名为的奇妙工具的自动响应功能吗?
sinonJS允许您在客户端执行同样的操作,它是一种ajax旁路代理如果您有兴趣查看示例,请告诉我。。。因此,sinonJS可以在不访问服务器的情况下响应任何ajax请求,如果你想模拟你的客户端,如果你想单元测试你的javascript代码,这是一种神奇的方法。

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

这个答案似乎应该可行,但如果异步事件不是ajax请求,该怎么办?我唯一的选择是通过回调手动触发事件吗?我想是的。您需要在异步进程中设置某种钩子,并标识该钩子已经完成。我不知道有哪种JavaScript构造可以对每种类型的异步操作都这样做。显然,您可以通过重写实现并在幕后执行一些魔术,为众所周知的实例(如window.setTimeout)创建自己的实例,但可以说,回调要容易得多。$。延迟可以帮助使实现变得干净。这个答案似乎应该是可行的,但是如果异步事件不是ajax请求呢?我唯一的选择是通过回调手动触发事件吗?我想是的。您需要在异步进程中设置某种钩子,并标识该钩子已经完成。我不知道有哪种JavaScript构造可以对每种类型的异步操作都这样做。显然,您可以通过重写实现并在幕后执行一些魔术,为众所周知的实例(如window.setTimeout)创建自己的实例,但可以说,回调要容易得多。$。延迟可以帮助使实现变得干净。
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();
});