Uważam, że chęć sprawdzenia, czy bierzesz udział w teście, czy nie, jest całkowicie uzasadniona. Istnieje wiele powodów, dla których może to być pomocne. Na przykład podczas uruchamiania testów wcześnie wracam z metod uruchamiania aplikacji / will-finish-launching w delegacie aplikacji, dzięki czemu testy zaczynają się szybciej dla kodu niezwiązanego z moim testem jednostkowym. Jednak nie mogę przejść testu „logiki” z wielu innych powodów.
Używałem doskonałej techniki opisanej powyżej przez @Michael McGuire. Jednak zauważyłem, że przestał działać dla mnie w okolicach Xcode 6.4 / iOS8.4.1 (być może wcześniej się zepsuł).
Mianowicie, nie widzę już XCInjectBundle podczas uruchamiania testu wewnątrz celu testowego dla mojej struktury. Oznacza to, że działam wewnątrz celu testowego, który testuje strukturę.
Tak więc, stosując podejście sugerowane przez @Fogmeister, każdy z moich schematów testowych ustawia teraz zmienną środowiskową, którą mogę sprawdzić.
Następnie mam kod na zajęciach o nazwie, APPSTargetConfiguration
który może odpowiedzieć na to proste pytanie.
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];
}
Jedynym zastrzeżeniem związanym z tym podejściem jest to, że jeśli uruchomisz test z głównego schematu aplikacji, na co pozwoli XCTest (to znaczy nie wybierzesz jednego ze schematów testowych), nie otrzymasz tego zestawu zmiennych środowiskowych.