XCTest не закончил в Xcode 5

У меня есть один тестовый класс и один тестовый пример. Когда я запускаю свой unit test, Xcode сообщает мне, что все мои тесты прошли, но у меня есть предупреждение о том, что мои тесты не закончились.

Нужно ли мне что-то делать с XCTest, чтобы сообщить ему, что я закончил с конкретным тестовым случаем?

Обновление: Это может быть проблема времени/ошибка. Я установил [NSThread sleepForTimeInterval:.1]; в методе tearDown, и теперь он работает каждый раз. Xcode также закончил тесты штрафом периодически самостоятельно без сна.

Обновление 2: Похоже на некоторую ошибку с некорректным Xcode, я добавил третий тест, который просто выполняет проверку форматирования текста, и предупреждение появляется снова.

Test Failure Image

Ответ 1

Я никогда не получал предупреждение, которое вы упомянули, но после преобразования в Xcode 5 XCTest (с помощью меню рефакторинга и смены рамки) мои тесты выполнялись вечно (для некоторого значения навсегда...), но никогда не начали выполнять (setUp и методы тестирования вообще не вызываются).

Я изменил тестовую цель, "Настроить параметры" > "Упаковка" > "Расширение Wrapper" с "octest" на "xctest", и проблема была немедленно решена.

Wrapper Extension setting existing and new value

Чтобы ответить на ваш вопрос, тест должен завершиться, как только закончится его выполнение, и завершится его метод tearDown. Тест без кода пройдет успешно. Попробуйте установить контрольную точку или лог-сообщение внутри вашего теста, чтобы убедиться, что он действительно вызван и убедитесь, что ваш tearDown не висит по какой-либо причине.

Ответ 2

Ваше обновление ссылается на сон в потоке tearDown, решая его, если вы делаете что-то вроде сетевой или фоновой обработки, удобной трюкой является установка флага и его очистка (и выдача ошибки, если нет). Очистите флаг в своем ответе.

Последовательность разгона и теста устанавливает таймер в течение двух секунд (ну, он ждет 250 мс восемь раз).

- (void)tearDown {
    [super tearDown];
    while (isProcessing > 0) {
        LogTrace(@"Polling...");
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.25]];
        isProcessing--;
        if(isProcessing == 0) {
            XCTFail(@"Network loop expired while awaiting response");
        }
    }
    LogTrace(@"Finished Polling");
}

-(void)testARandomRequest {
    isProcessing = 8;

    NSDictionary *parameters = @{@"code": @"54321"};
    [manager doAFNetworkPatch:@"restApi/1" andParameters:parameters andPredicate:^(NSURLResponse *response, NSError *error) {
        NSLog(@"Response received");
        isProcessing = 0;
    }];
}

Ответ 3

У меня была такая же проблема, как и при попытке запустить на iOS6-симуляторе. Убедитесь, что вы проводите тесты на симуляторе iOS7, а не на iOS6. XCTest доступен только с iOS7.