Javascript 测试包含异步代码的函数
有了qUnit,我知道如果测试中有异步代码,如何使用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请求返回的数
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();
});