Обработка нескольких прослушивателей событий

Обновление: вот небольшая часть моей проблемы. Тесты проходят один раз и не проходят в следующий раз:

http://jsfiddle.net/samselikoff/hhk6u/4/

Проблема в том, что departments имеет events.on("userSet:company"), поэтому обе переменные реагируют на событие.


Это общий вопрос о модульном тестировании. В моем приложении запускается определенное событие, и несколько других частей моего приложения прослушивают это событие. Я хотел бы протестировать каждую часть отдельно, поскольку они выполняют разные функции; но для этого я должен запускать событие в каждом тесте.

Это вызывает проблемы, так как первый тест должен инициировать событие, вызывая слушателей в других тестах. Как я могу сохранить свои тесты атомарными, продолжая тестировать несколько прослушивателей событий?

(Я использую QUnit, но я думаю, что это более общий вопрос модульного тестирования).

Ответ:

Джефферсон прав. Один из простых способов решить эту проблему — использовать events.once вместо events.on. Таким образом, вы очищаете свои события от каждого теста.


person Sam Selikoff    schedule 20.05.2013    source источник


Ответы (1)


Все ваши вызовы асинхронных методов должны быть протестированы с использованием методов «asyncTest» и убедиться, что вы переносите свои вызовы в другие функции, которые вызывают QUnit.start(), когда данные утверждений готовы для сбора и анализа.

Я обновил ваш JSFiddle рабочим кодом: http://jsfiddle.net/hhk6u/8/ новый код:

QUnit.config.autostart = false;
QUnit.config.testTimeOut = 1000;

asyncTest('Some test that needs companies.', function() {
    function getCompanies() {
        var companies = new Companies();
        ok(1);
        start();
    }
    setTimeout(getCompanies, 500);
});

asyncTest('Some other async test that triggers a listener in companies.', function() {   
    var companies = new Companies();

    events.trigger("userSet:company", { name: "Acme", id: 1 });

    stop();
    events.on('fetched:departments', function(response) {
        console.log(response);
        deepEqual(response, [1, 2, 3]);
        start();
    });
});

См. мой ответ в этом другом вопросе для получения более подробной информации: Тест завершается неудачно, затем завершается успешно

Надеюсь, это поможет вам!

person jfoliveira    schedule 21.05.2013