Ich glaube, es ist völlig legitim zu wissen, ob Sie in einem Test laufen oder nicht. Es gibt zahlreiche Gründe, warum dies hilfreich sein kann. Wenn ich beispielsweise Tests ausführe, kehre ich frühzeitig von den Methoden zum Starten der Anwendung / zum Beenden der Anwendung im App-Delegaten zurück, sodass die Tests für Code, der für meinen Komponententest nicht relevant ist, schneller beginnen. Aus vielen anderen Gründen kann ich jedoch keinen reinen "Logik" -Test machen.
Ich habe die ausgezeichnete Technik verwendet, die oben von @Michael McGuire beschrieben wurde. Mir ist jedoch aufgefallen, dass Xcode 6.4 / iOS8.4.1 für mich nicht mehr funktioniert (möglicherweise ist es früher kaputt gegangen).
Ich sehe nämlich das XCInjectBundle nicht mehr, wenn ich einen Test in einem Testziel für ein Framework von mir ausführe. Das heißt, ich laufe in einem Testziel, das ein Framework testet.
Unter Verwendung des von @Fogmeister vorgeschlagenen Ansatzes legt jedes meiner Testschemata jetzt eine Umgebungsvariable fest, nach der ich suchen kann.
Dann ist hier ein Code, den ich für eine Klasse namens habe APPSTargetConfiguration
, der diese einfache Frage für mich beantworten kann.
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];
}
Die einzige Einschränkung bei diesem Ansatz besteht darin, dass Sie diese Umgebungsvariable nicht erhalten, wenn Sie einen Test über Ihr Haupt-App-Schema ausführen, wie Sie es mit XCTest tun können (dh keines Ihrer Testschemata auswählen).