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 за раз, но я мог бы жить с этим. Удачи.