У меня есть угловая служба, которая делает некоторые асинхронные вещи (на основе таймеров). Одна из вещей, которые вы можете сделать с помощью таймера определить «обработчик», который стреляет по истечении таймера (как в этом псевдо-код):Угловая + Карма: Тестирование асинхронных функций
flag = false;
timer = new Timer(1000); // ms
timer.handler = function() { flag = true };
В этом тривиальном случае таймер будет установлен флаг верно через 1 секунду. Как я могу проверить это с помощью углового/кармы/жасмина?
От чтения документации, я ожидал бы, чтобы это работало:
...
flag = false;
timer = new Timer(1000);
timer.handler = function() { flag = true };
expect(flag).toBe(false);
sleep(2)
expect(flag).toBe(true);
...
Вместо того, чтобы быть морально в вертикальном положении, что тест решил потерпеть неудачу с этим:
ReferenceError: Can't find variable: sleep
После некоторого чтения, по-видимому, Я не могу использовать угловой сценарий с Жасмином. Хорошо, я в порядке.
ОБНОВЛЕНИЕ: В комментариях я опробовал свой «рабочий» метод установления. Его никогда не называют.
Так это работает:
...
flag = false;
timer = new Timer(1000);
timer.handler = function() { flag = true };
expect(flag).toBe(false);
setTimeout(function() { expect(flag).toBe(true) }, 2000);
...
Но чувствует себя немного странно.
Вопрос: Есть ли лучший способ?
Fun Trivia: Да, я знаю около $ таймаута. У меня есть очень хорошие причины (TM) для того, чтобы делать то, что я делал глубоко в кодовых шахтах, вдали от дневного света =)
Почему стандартный тайм-аут кажется странным? – rdodev
, если вы должны использовать $ timeout, вы могли бы назвать $ timeout.flush(); с этим вы можете протестировать условия предварительного таймера и условия посттаймера. Но вы этого не хотите :) – michael
@rdodev: Ну, я не знаю, почему это было странно раньше, но я только что протестировал, и ожидание() внутри таймаута фактически не вызвано (я установил время до 10 секунд и повторить тест, но он завершился почти сразу). –