Утверждение в основном делает это:
function assertEquals( value:*, ...rest) : void {
for each( var item:* in rest )
if( item != value ) throw new Error("fail");
}
Это (псевдокод) утверждение проверяет, имеют ли переданные параметры ожидаемое значение, и выдает ошибку, если их нет. Так что на самом деле нет никаких ограничений на то, куда вы можете помещать утверждения - это просто старые старые методы, которые выдают ошибку, если некоторые условия не выполняются.
Среда модульного тестирования запускает каждый метод тестирования в блоке try/catch
, и любые непредвиденные ошибки, вызванные утверждениями, приводят к сбою теста. Вот как другие тесты могут продолжать работать, и как вы получаете ваши сообщения и результаты, даже если что-то пошло не так.
Проблема в том, что: если вам нужно сделать асинхронные утверждения, то есть проверить значения переменных в более поздний момент времени, поведение тестовой среды становится намного более сложным. Каким-то образом все вызовы методов, которые происходят между концом основного метода тестирования и фактическим концом теста, также должны отслеживаться, объекты, которые были созданы в setUp()
, должны продолжать существовать, и все ошибки должны по-прежнему перехватываться. - иначе, весь тестовый запуск зависнет, и вы получите множество ошибок «ссылка на нулевой объект».
Фреймворк, однако, не может знать, когда закончится текущий тест, если нет какого-либо способа сообщить о полноте - и по этой причине вы должны использовать хотя бы один asyncHandler
(или failOnEvent
/ proceedOnEvent
, если вам нужно только проверить, было ли событие отправлено / не отправлено вообще) для обработки события, отмечающего конец теста, т. е. в вашем случае, TimerEvent.TIMER_COMPLETE
- или сбой, если это событие никогда не встречалось. В любом случае теперь можно запустить следующий тест.
Я считаю, что можно использовать несколько asyncHandlers
в одном и том же тесте, но я не уверен, что asyncHandler
будет работать правильно, если вызывается несколько раз в цикле - это как-то противоречит функциональности тайм-аута.
Чтобы все было хорошо читаемым и чтобы вы сами отметили, где ожидается завершение теста, я рекомендую использовать только один asyncHandler
на тест - и помещать все остальные утверждения в «обычные» методы обработчика событий.
Кстати, если вам интересно, как работает остальная часть FlexUnit, вы можете найти полный исходный код на GitHub .