Проблемы модульного тестирования функции setInterval в Javascript - PullRequest
0 голосов
/ 16 ноября 2009

У меня проблемы с тестированием функции window.setInterval в моем файле Javascript. Ниже приведен сценарий ... в основном у меня есть функция setInterval в функции, которую я хочу проверить:

var dummy = false; // global variable not set anywhere else
var INTERVAL_TIME = 20; // global variable not set anywhere else
function myFunction() 
{
    var id = window.setInterval(function() {
        if (...)
        {
            window.clearInterval(id);
        }
        else
        {
            if(...)
            {
                dummy = true;
            }
        }
    }, INTERVAL_TIME);
}

И у меня есть следующий тестовый код в JsTestDriver:

TestMyFunction.prototype.test_myFunction() {
    myFunction();
    assertTrue(dummy);
}    

Каждый раз, когда выполняется тест, он терпит неудачу и говорит, что фиктивный элемент равен false, как если бы вся функция setInterval никогда не вызывалась. Я пытался играть с интервалом безуспешно. Если я добавлю предупреждение в предложении else, оно появится через доли секунды и исчезнет (и тест все равно не пройден).

Код работает. У меня такое ощущение, что это проблема синхронизации, когда тест завершается раньше, чем функция setInterval, поэтому я жалуюсь, что для фиктивного значения не задано значение true. Любые предложения / решения этой проблемы?

Спасибо.

Ответы [ 4 ]

1 голос
/ 03 декабря 2009

Я использовал JsUnitMockTimeout.js для имитации функции setInterval. Это работало как драгоценный камень:)

1 голос
/ 16 ноября 2009

Почему бы не включить setTimeout в ваш тест, чтобы отложить проверку значения фиктивного значения до истечения 25 мс.

0 голосов
/ 16 ноября 2009

Похоже, что "JsTestDriver не может выполнить асинхронное тестирование" . Единственный каркас тестирования JS Unit, который я использовал с поддержкой асинхронной синхронизации, это Qunit .

Qunit имеет asyncTest , который будет работать с ajax или тайм-аутами.

PS: есть совершенно новая среда тестирования JS Доказательства . Я не пробовал это.

0 голосов
/ 16 ноября 2009

assertTrue(dummy); выполняется до интервала времени 20 мс. Поскольку вы используете интервал, вы периодически опрашиваете фиктивное значение? Первый опрос даст вам false, если у вас нет супер медленного ПК.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...