QUnit с Ajax, QUnit проходит неудачные тесты - PullRequest
14 голосов
/ 02 июня 2009

Я ищу 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);
    }
  });
}

Ответы [ 4 ]

25 голосов
/ 02 июня 2009

Запуск и остановка с использованием библиотеки 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();
  });
});
13 голосов
/ 06 октября 2010

Настоящей проблемой здесь не является необходимость вызова методов 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 голосов
/ 15 апреля 2013

В моем проекте много тестов 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();
      });
    });
2 голосов
/ 02 июня 2009

Я провел некоторое тестирование Quitit с Ajax. это не красиво. лучшее, что я могу получить, это остановить тестирование при запуске ajax и запустить его снова в обратном вызове успеха. (используя методы start () и stop ()). Это означало один запрос ajax за раз, но я мог с этим жить. Удачи

...