Тестирование асинхронного поведения в рамках модульного тестирования будет затруднено, поскольку в этот момент вы пишете интеграционный тест, а не модульный тест. Это не значит, что эти компоненты не могут быть протестированы, но вместо модульного тестирования не следует пытаться тестировать их из конца в конец.
Для элементов пользовательского интерфейса вы можете проверить, что они созданы, вы можете проверить, что они содержат ожидаемые вами значения, вы можете проверить, что при взаимодействии с ними происходит правильное действие (т. Е. Вызывается метод IBAction, ожидаемый контроллер представления). помещается на текущий контроллер навигации), но вам не нужно выполнять пошаговые действия, такие как анимация или просмотр переходов контроллера, в одном тесте.
Для сетевых запросов вы можете проверить, что класс отправляет данные, которые вы ожидаете от него, и вы можете отдельно проверить, что класс предпринимает соответствующие действия, когда возвращаются различные типы данных. В обоих случаях вы можете заменить действительное сетевое соединение на фиктивное или фальшивое вместо того, чтобы фактически подключаться к удаленному серверу. Кроме того, вам не нужно проверять отправку и получение данных в одном тесте.
Ваши тесты должны проверять ваш код, а не то, что UIKit может анимировать представления или что NSURLConnection может отправлять и получать данные, поэтому разрабатывайте свои тесты так, чтобы они фактически проверяли вашу логику и заглушали внешние зависимости тестируемого кода.
При этом GHUnit предоставляет GHAsyncTestCase , который позволяет вам писать тесты, которые будут ожидать определенных типов асинхронного поведения.