Асинхронные вызовы обычно проблематичны при модульном тестировании JS.В прошлом я решил эту проблему, сделав вызовы XHR эффективно синхронными, заблокировав основной поток до тех пор, пока вызов XHR не будет успешным.Как это сделать, зависит от вашей структуры, и я незнаком с Harmony и RightJS.Однако логика будет выглядеть примерно так:
- Переопределите ваш метод XHR, чтобы он поддерживал блокировку / мьютекс.Замок может быть простым логическим значением.Когда какой-либо XHR находится в процессе, блокировка будет
true
, когда XHR не обрабатывается, блокировка будет false
. - . В вашем тесте, прежде чем запустить утверждение, добавьте цикл, который выполняетсяваш XHR, а затем ждет, пока блокировка не будет снята.
- Как только цикл завершится, вы будете уверены, что XHR завершен, и вы можете запустить свое утверждение.
НамерениеЭтот подход заключается в том, чтобы избежать изменения вашего кода, который сделает ваши тесты недействительными.К сожалению, это также означает, что вы не можете сами протестировать возвращаемое значение, но я думаю, что это будет предостережением для любой стратегии, которая не изменяет ваш код.
Другим подходом будет фактический запуск ваших тестов асинхронно--ie.приложите свое утверждение к обратному вызову onSuccess, используя AOP.Однако многие тестовые наборы не очень хорошо работают с асинхронными тестами, поскольку настройка одного теста может начинаться до завершения предыдущего теста (т. Е. Потому что предыдущий тест все еще ожидает возврата асинхронного вызова).
Последний подход заключается в том, чтобы макетировать все асинхронные вызовы.То есть.просто переопределите XHR, и ваш тест подтвердит, что он был вызван с правильными аргументами.Я мог бы предпочесть такой подход, если у меня есть интеграционные тесты, которые проходят через весь асинхронный стек.