随着qUnit,我知道如何使用asyncTest()
你的测试中,如果你有异步代码,但如果你有一个包含异步代码的功能?
换言之,异步请求不是测试中,但仅仅是正被测试的代码的一部分。
举个例子的代码:
function makeAjaxCall(){
$.get('/mypage', {}, function(data){
// Do something with `data`
},'json');
}
我怎么能叫makeAjaxCall()
的测试中,然后运行该测试data
是从Ajax请求返回?
您可以使用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自己重新分析他们。 不理想,但我不知道的另一种方式。
似乎没有人关心mockAjax ,所以我找到了更好的东西,这些天: sinonJS ! 你知道这个名为奇妙的工具的功能,自动回复提琴手 ? sinonJS允许你做在客户端一样,它是一种AJAX旁路代理。 如果你有兴趣看到一个例子,让我知道 ......所以sinonJS可以在不访问服务器的任何响应Ajax请求,这是一种魔法,如果你想戏弄你的客户,如果你想进行单元测试JavaScript代码。