Не удается подтвердить изменение 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(),

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