Тестирование вручную запускаемых событий в JsTestDriver - PullRequest
1 голос
/ 05 июля 2011

Каков наилучший способ проверки обработки событий в объектах?Я не могу понять это.

У меня есть объект, который устанавливает несколько прослушивателей событий, и когда он наблюдает, как эти события запускаются, он изменяет объект dom на странице.Когда у меня есть несколько тестов, последний из приведенных ниже примеров завершается неудачно, если я закомментирую другие, все нормально.

У меня есть набор тестов, который выглядит как

var TitleTest = TestCase('TitleTest');

TitleTest.prototype.defaultTitle = 'title';
TitleTest.prototype.defaultCount = '0';

TitleTest.prototype.setUp = function() {
    var titleObj;
    this.div = new Element('div');
    $$('body').first().insert(this.div);
    this.div.insert('<div id="title"><h1><span id="titleCaption">' + this.defaultTitle + '</span><span id="titleCount">' + this.defaultCount + '</span></h1></div>');
    titleObj = new Title();
});

TitleTest.prototype.testNewItemsEvent = function() {
    var data = {count: 10};

    assertEquals('Count should be zero before events are fired', this.defaultCount, $('titleCount').innerHTML);
    document.fire('custom:NewItems', data);
    assertEquals('New count should be 10', data.count + '', $('titleCount').innerHTML);
});

// ... a few other simple tests like the one above

TitleTest.prototype.testUpdateSpecial = function() {
    var data = {caption: 'Special Title', count: 10},
        specialObj = {special: {type: 2, value: 5}};

    // Emulate a special type of category, that can only be 
    // added at page load
    document.fire('custom:UpdateTitle', data);
    assertEquals(data.caption, $('titleCaption').innerHTML);
    assertEquals(data.count, $('titleCount').innerHTML);

    //Removing the special category should revert the title to its default
    document.fire('custom:RemoveSpecial', specialObj);
    assertEquals(this.defaultTitle, $('titleCaption').innerHTML);
    assertEquals(this.defaultCount, $('titleCount').innerHTML);

    // only way to get this added back in during non load is using
    // javascript history so it needs to revert to previous state
    document.fire('custom:AddSpecial', specialObj);
    assertEquals(data.caption, $('titleCaption').innerHTML);
    assertEquals(data.count + '', $('titleCount').innerHTML);
});

Последняя параиз утверждений всегда будет неудачным, если предыдущие тесты будут выполнены, но пройдет, если я закомментирую другие тесты.Я в растерянности, что я могу сделать, чтобы заставить это работать.

Редактировать: вот код, который обрабатывает добавление / удаление специальных заголовков

    Event.observe(document, 'custom:UpdateTitle', function(event) {
        if (event.memo.caption) {
            this._updateCaption(event.memo.caption);
        }

        if (event.memo.count) {
            this._updateCount(event.memo.count);
        }   

    }.bind(this));


    Event.observe(document, 'custom:RemoveSpecial', function(event) {
        if (
            event.memo.special.type === 1 ||
            event.memo.special.type === 2 ||
            (   
                event.memo.special.type === 3 &&
                parseInt(event.memo.special.value, 10) === 8
            )   
        ){  
            this._previousTitle = $('titleCaption').innerHTML;
            this._resetTitle();
        }   
    }.bind(this));

    Event.observe(document, 'custom:AddSpecial', function(event) {
        if (
            event.memo.special.type === 1 ||
            event.memo.special.type === 2 ||
            (   
                event.memo.special.type === 3 &&
                parseInt(event.memo.special.value, 10) === 8
            )   
        ){  
            if (!this._previousTitle.blank()) {
                this._updateCaption(this._previousTitle);
            }   
        }   
    }.bind(this));

Ответы [ 2 ]

1 голос
/ 11 июля 2011

@ meyertee намекает на решение моей проблемы.Я предположил, что установка и разборка работали как PHPUnit, где они запускаются только до и после всех тестов, но jsTestDriver запускает их до и после каждого теста.Поскольку я настраивал события DOM и Title в настройке, перед каждым тестом создавался новый титровальный объект, и таким образом большее количество слушателей вызывало состояние гонки.Я переместил создание экземпляра моего объекта Title из настройки, и это устранило проблему.

1 голос
/ 06 июля 2011

Попробуйте написать код очистки в методе tearDown, чтобы отделить titleObj и его слушателей от DOM.Насколько я знаю, jsTestDriver сбрасывает DOM после каждого теста, но я не уверен, что происходит с объектами, слушающими события DOM.У вас все еще может быть старый titleObj, который не может быть собран мусором, поскольку он подключен к DOM.

Кроме этого, способ тестирования событий DOM выглядит нормально.Запустите событие DOM и подтвердите, что код сделал то, что должен ...

...