QUnit с Ajax, QUnit пропускает неудачные тесты
Я изучаю QUnit для тестирования модуля JavaScript. Я в странной ситуации, когда я проверяю значение, полученное от вызова Ajax.
Для следующего теста я намеренно пытаюсь его провалить.
// 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");
});
});
Но он заканчивается все время. Вот метод getPersons, который делает вызов Ajax.
function getPersons(callback) {
var persons = null;
$.ajax({
type: "POST",
dataType: "json",
data: {},
contentType: "application/json",
url: "AjaxService.asmx/GetPersons",
success: function(response) {
callback(response);
}
});
}
Ответы
Ответ 1
Запуск и остановка с использованием библиотеки 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();
});
});
Ответ 2
Реальная проблема здесь не требует вызова методов start() и stop() - на самом деле вы можете столкнуться с трудностями при использовании этого подхода, если не будете осторожны при вызове stop() снова в конце вашего обратного вызова если у вас есть дополнительные методы .ajax(). Что тогда означает, что вы находите себя в каком-то зарытом беспорядке, который должен отслеживаться, если все обратные вызовы были уволены, чтобы узнать, нужно ли снова вызвать stop().
Корень проблемы включает поведение асинхронных запросов по умолчанию, а простое решение состоит в том, чтобы сделать запрос .ajax() синхронно, установив для свойства async значение false:
test("synchronous test", function() {
$.ajax({
url:'Sample.asmx/Service',
async:false,
success: function(d,s,x) { ok(true, "Called synchronously"); }
});
});
Даже лучший подход заключается в том, чтобы разрешить асинхронное поведение и использовать правильный метод вызова метода: asyncTest(). Согласно документам "Асинхронные тесты ставятся в очередь и запускаются один за другим. Эквивалент вызова обычного теста() и немедленного вызова stop()."
asyncTest("a test", function() {
$.ajax({
url: 'Sample.asmx/Service',
success: function(d,s,x) {
ok(true, "asynchronous PASS!");
start();
}
});
});
Ответ 3
В моем проекте много тестов qunit. как:
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();
});
});
Ответ 4
ive выполнил некоторое тестирование qunit с помощью ajax. его не очень. самое лучшее, что я мог бы придумать, это остановить тест, когда ajax уволен, и начать его снова в обратном вызове успеха. (используя методы start() и stop()). Это означало один запрос ajax за раз, но я мог бы жить с этим. Удачи.