Модульный тест на NSNotification, который отправляется NSTimer асинхронно

Уже несколько дней я пытаюсь понять, как протестировать свой API с помощью GHUnit. Теперь я пришел к проблеме, чтобы проверить это:

API получает несколько входных данных, CUT что-то делает и запускает NSTimer. После запуска таймера он отправляет NSNotification с некоторыми данными userInfo. Понятно, как проверить данные userInfo, но я хочу проверить, отправляется ли уведомление только при соблюдении некоторых определенных обстоятельств, а если нет, то его вообще не следует отправлять.

Как я могу это протестировать, стало ясно после прочтения этого: http://www.hpique.com/2013/12/nsnotificationcenter-part-3/

Но теперь возникает логическая проблема: асинхронное поведение CUT с отправкой NSNotification после срабатывания NSTimer. Теперь, когда я буду ждать в каждом тесте, пока сработает таймер, мои тесты станут очень медленными.

Как я могу проверить поведение, не дожидаясь срабатывания NSTimer? У тебя есть идеи?


person copydigital    schedule 21.10.2015    source источник
comment
Итак, ваш вопрос на самом деле заключается в том, возможно ли выполнить один или несколько асинхронных тестов одновременно, и существует ли такая вещь, как асинхронный тест`?   -  person CouchDeveloper    schedule 21.10.2015
comment
Более менее. Настоящая идея состоит в том, чтобы избавиться от таймера, чтобы асинхронный тест стал синхронным тестом, который можно довольно легко протестировать. И если это невозможно, как правильно протестировать это асинхронное поведение и не получить медленные тесты.   -  person copydigital    schedule 21.10.2015


Ответы (1)


Я не знаю, как выполнять синхронные тесты одновременно с XCTest из Xcode. Конечно, вы можете определить несколько тестовых проектов и запускать их одновременно с консоли. Но я думаю, это не то, что вы ищете.

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

С XCTest невозможно провести асинхронный тест. В документации по исходному коду есть подсказки, которые заставляют меня поверить, что это, скорее всего, вообще невозможно:

В описании к waitForExpectationsWithTimeout указано:

"-waitForExpectationsWithTimeout:handler: создает точку синхронизации в потоке теста. Только один -waitForExpectationsWithTimeout:handler: может быть активен в любой момент времени, но несколько дискретных последовательностей {ожиданий -> ожидания} могут быть объединены в цепочку вместе."

"waitForExpectationsWithTimeoutзапускает цикл выполнения при обработке событий до тех пор, пока не будут выполнены все ожидания или не истечет время ожидания. Клиенты не должны манипулировать циклом выполнения при использовании этого API."

Таким образом, только один waitForExpectationsWithTimeout:handler: может быть активен, и мы не должны изменять базовый цикл выполнения — это совершенно ясно указывает на то, что мы не можем выполнять тесты асинхронно.

Примечание. вы можете тестировать асинхронные методы или функции внутри тестового метода. Однако в XCTest сам метод тестирования всегда синхронный, так как он ждет получения результата.

person CouchDeveloper    schedule 21.10.2015
comment
Да, я слышал некоторые слухи об этом факте, что XCTest немного бесполезен в этом особом случае. И даже у GHUnit нет возможности для этого, верно? - person copydigital; 21.10.2015
comment
GHUnit утверждает, что он может запускать тесты параллельно. Кроме того, существует GRUnit, который улучшает асинхронное тестирование. Однако я не знаком с этими тестовыми средами. Чтобы получить более качественную помощь, вы должны опубликовать свой код. - person CouchDeveloper; 21.10.2015
comment
Почему бы не запустить все в одном тест-кейсе и не использовать временные ожидания? Вы достигаете почти того же с меньшими усилиями. - person Ben Affleck; 22.10.2015