qunit + mockjax: Когда мне следует вызывать mockjaxClear в асинхронных тестах?

Я тестирую свой код интерфейса, используя qunit и mockjax. Структура тестов AJAX в собственном тестовом коде mockjax выглядит следующим образом ( jsfiddle):

var testURL = "/test/data",
    testData = { a: 1, b: "c" };

asyncTest("AJAX response test", 1, function() {
    $.mockjax({
        url: testURL,
        responseText : JSON.stringify(testData)
    });

    $.ajax({
        url: testURL,
        dataType: "json",
        success: function(data) {
            deepEqual(data, testData, 'AJAX response is OK');
        },
        complete: function() {
            start();
        }
    });

    $.mockjaxClear();
});

Согласно документации mockjax:

* $.mockjaxClear() 
    Removes all mockjax handlers.

Что я не понимаю, почему mockjaxClear называется сразу после $.ajax() вызов. Проблема в том, что если он выполняет какую-то очистку, как сказано в документации, эта очистка будет запущена до получения ответа AJAX (см. Консоль этого jsfiddle). Мне кажется более логичным выполнить очистку в обработчике complete событие. Может кто-нибудь объяснить мне, почему лучше позвонить mockjaxClear после $.ajax() ?

2 ответа

Решение

Если вы посмотрите на код, то увидите, что очистка не влияет на уже "запущенные" вызовы. Это просто гарантирует, что любой последующий $.ajax() вызовет оригинальный метод jQuery, и это другое внутреннее состояние (но опять же, не затрагивающее уже ожидающие "запросы") будет очищено.

Это может помочь гарантировать, что $.ajax() тестовый тест отправляется только один раз (если отправлено еще больше, он потерпит неудачу, более того start() метод будет вызван снова, сообщая об ошибке в Qunit).

Это также может быть просто для поддержания чистоты кода (меньше всего в обработчиках обратного вызова).

Я не думаю, что ты должен бежать $.mockjaxClear где-нибудь в ваших тестах на самом деле. QUnit предоставляет ловушки жизненного цикла для тестов, запускаемых в модуле, в данном случае важным является демонтаж.

http://api.qunitjs.com/module/

Используя это, ваш код должен быть что-то вроде

module( "myapi", {
    teardown: function() {
        $.mockjaxClear();
    }
});

asyncTest( "sometest", function() {
    // test definition
});

Если бы вы захотели, вы могли бы даже перенести свои макеты в setup хук жизненного цикла, чтобы сделать ваш реальный тестовый код более компактным и сфокусированным только на самом тесте, а не на настройке / разборке.

Другие вопросы по тегам