Не удается подтвердить изменение DOM с помощью асинхронного тестового драйвера JS
У меня есть функция, которая изящно загружает изображение внутри указанного контейнера. Следующая функция работает, но модульный тест не работает (я знаю, стыд, стыд, код перед тестом).
Первые 3 утверждают работу, последние 2 - нет (проверяется, комментируя одно, затем другое, затем оба).
Сначала я подумал, что проблема заключается в том, что изображение не загружается вовремя для утверждения, и поэтому я сделал тест асинхронным. Но, возможно, в Firebug моя функция не обновляет тот же DOM? Это возможно? Если так, как я могу исправить это поведение?
Вот функция:
function insertImage(container, url) {
var img = new Image();
$(img)
.load(function () {
$(this).hide();
$(container)
.removeClass("loading")
.append(this);
$(this).fadeIn();
})
.attr("id", "testImg")
.attr("src", url);
};
Вот контрольный пример:
var ImageTest = AsyncTestCase('ImageTest');
ImageTest.prototype.testInsertImage = function(queue) {
var url = "test/resources/testimage.jpg";
var testContainer;
var testImage;
assertUndefined(this.testContainer); // PASSES
/*:DOC testContainer = <div id="testDiv"></div>*/
assertNotUndefined(this.testContainer); // PASSES
insertImage("#testDiv", url);
queue.call('Step 1: Wait 5 seconds for Image', function(callbacks) {
var myCallback = callbacks.add(function() {
testImage = document.getElementById("testImg");
});
window.setTimeout(myCallback, 5000);
});
queue.call('Step 2: Assert Image loaded', function() {
assertTrue(this.testContainer != null); // PASSES
assertTrue(this.testImage != null); // FAILS
assertTrue(this.testContainer.hasChildNodes()); // FAILS
});
};
1 ответ
Обновленный DOM - это одно и то же. Похоже, у вас есть две проблемы:
1) Вы используете случайным образом this.
в ваших тестах.
2).hasChildNodes () завершится ошибкой, если ваш комментарий прав, что this.testContainer =
Также может быть хорошей идеей обернуть начальные утверждения в queue.call()
,