Я вважаю, що цілком законно хотіти знати, працюєш ти в тесті чи ні. Існує безліч причин, чому це може бути корисним. Наприклад, під час запуску тестів я повертаюся раніше від методів application-did / will-finish-launch у App Delegate, роблячи тести швидшими для коду, який не є загальним для мого модульного тесту. Проте я не можу пройти чистий "логічний" тест з цілої низки інших причин.
Раніше я використовував чудову техніку, описану вище @Michael McGuire. Однак я помітив, що перестав працювати для мене навколо Xcode 6.4 / iOS8.4.1 (можливо, він зламався раніше).
А саме, я більше не бачу XCInjectBundle під час запуску тесту в тестовій мішені для мого фреймворка. Тобто я працюю всередині тестової цілі, яка тестує фреймворк.
Отже, використовуючи підхід, який пропонує @Fogmeister, кожна з моїх тестових схем тепер встановлює змінну середовища, на яку я можу перевірити.
Потім, ось якийсь код, який я маю в класі, APPSTargetConfiguration
який може відповісти на це просте запитання для мене.
static NSNumber *__isRunningTests;
+ (BOOL)isRunningTests;
{
if (!__isRunningTests) {
NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *isRunningTestsValue = environment[@"APPS_IS_RUNNING_TEST"];
__isRunningTests = @([isRunningTestsValue isEqualToString:@"YES"]);
}
return [__isRunningTests boolValue];
}
Одне застереження при такому підході полягає в тому, що якщо ви запустите тест із вашої основної схеми програми, як вам дозволить XCTest (тобто, не вибравши одну зі своїх тестових схем), ви не отримаєте цієї змінної середовища.