Javascript QUnit使用Ajax,QUnit通过了失败的测试
我正在研究用于JavaScript单元测试的QUnit。我遇到了一个奇怪的情况,我正在检查Ajax调用返回的值Javascript QUnit使用Ajax,QUnit通过了失败的测试,javascript,jquery,ajax,unit-testing,qunit,Javascript,Jquery,Ajax,Unit Testing,Qunit,我正在研究用于JavaScript单元测试的QUnit。我遇到了一个奇怪的情况,我正在检查Ajax调用返回的值 function getPersons(callback) { var persons = null; $.ajax({ type: "POST", dataType: "json", data: {}, contentType: "application/json", url: "AjaxService.asmx/GetPersons
function getPersons(callback) {
var persons = null;
$.ajax({
type: "POST",
dataType: "json",
data: {},
contentType: "application/json",
url: "AjaxService.asmx/GetPersons",
success: function(response) {
callback(response);
}
});
}
在接下来的测试中,我故意尝试不及格
// test to check if the persons are returned!
test("getPersons", function() {
getPersons(function(response) {
// persons = $.evalJSON(response.d);
equals("boo", "Foo", "The name is valid");
});
});
但它最终总是会过去。下面是进行Ajax调用的getPersons方法
function getPersons(callback) {
var persons = null;
$.ajax({
type: "POST",
dataType: "json",
data: {},
contentType: "application/json",
url: "AjaxService.asmx/GetPersons",
success: function(response) {
callback(response);
}
});
}
我用ajax做了一些质量测试。它不漂亮。我能做的最好的事情就是在启动ajax时停止测试,并在成功回调中再次启动它。(使用start()和stop()方法)。这意味着每次只能有一个ajax请求,但我可以接受。祝你好运开始和停止使用QUnit库似乎正在工作
// test to check if the persons are returned!
test("getPersons", function() {
stop();
getPersons(function(response) {
persons = $.evalJSON(response.d);
equals(persons[0].FirstName, "Mohammad");
start();
});
});
这里真正的问题是不需要调用start()和stop()方法——事实上,如果您在回调结束时不小心再次调用stop(),如果您有其他的.ajax()方法,那么使用这种方法可能会遇到麻烦。这意味着你发现自己陷入了一个混乱的境地,如果所有的回调都被触发了,你就必须跟踪,以知道你是否还需要再次调用stop() 问题的根源在于异步请求的默认行为——简单的解决方案是通过将async属性设置为false,使.ajax()请求同步发生:
test("synchronous test", function() {
$.ajax({
url:'Sample.asmx/Service',
async:false,
success: function(d,s,x) { ok(true, "Called synchronously"); }
});
});
即使如此,最好的方法还是允许异步行为并使用正确的测试方法调用:。根据文档“异步测试排队并一个接一个地运行。相当于调用普通测试()并立即调用stop()
在我的项目中有很多质量测试。比如:
module("comment");
asyncTest("comment1", function() {
expect(6);
$.ajax({
url: 'http://xxx.com/comment',
dataType: "json",
type: "GET",
timeout: 1000
}).done(function(data) {
ok(true, "loaded");
ok(data.data.length>1, "array size");
ok(data.total, "attr total");
var c = data.data[0];
ok(c.id, "attr c.id");
ok(c.user_id, "attr c.user_id");
ok(c.type == 4, "attr c.type equal 4");
}).fail(function(x, text, thrown) {
ok(false, "ajax failed: " + text);
}).always(function(){
start();
});
});
启动和停止似乎都起作用了!解决方案发布在下面的帖子中。谢谢但我想知道为什么我的上述方法不起作用。我可以访问响应和所有内容。似乎平等者都失败了!我认为,由于ajax的异步特性,测试在响应返回之前就完成了AsyncTest(名称,…)是一种方便的测试方法(名称,函数(){stop();…})。嵌套=坏主意。@Jörn-谢谢你指出嵌套。回过头来看这个答案,我不确定我为什么要把它放在第一位,而不是为了说明你能做什么。我已经打开了asyncTest方法的包装,以便更清楚地了解它的用途。我建议您也填写“expect”数字(QUnit.test的第二个参数)),以便在没有及时调用所有内容时更容易捕获。否则,如果在发送所有断言之前过早调用了
start
,则它可能会通过。正如@Goyuix所说,您也可以使用asyncTest()
而不是test()
来避免调用stop()
函数,并明确表示这是一个异步测试。