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
хук жизненного цикла, чтобы сделать ваш реальный тестовый код более компактным и сфокусированным только на самом тесте, а не на настройке / разборке.