Creo que es completamente legítimo querer saber si se está ejecutando dentro de una prueba o no. Existen numerosas razones por las que esto puede resultar útil. Por ejemplo, al ejecutar pruebas, regreso antes de los métodos de ejecución de la aplicación / finalizará el lanzamiento en el Delegado de la aplicación, lo que hace que las pruebas comiencen más rápido para el código que no es pertinente para mi prueba unitaria. Sin embargo, no puedo hacer una prueba de pura "lógica", por una serie de otras razones.
Solía usar la excelente técnica descrita por @Michael McGuire anteriormente. Sin embargo, noté que dejó de funcionar para mí alrededor de Xcode 6.4 / iOS8.4.1 (quizás se rompió antes).
Es decir, ya no veo el XCInjectBundle cuando ejecuto una prueba dentro de un objetivo de prueba para un marco mío. Es decir, estoy corriendo dentro de un objetivo de prueba que prueba un marco.
Entonces, utilizando el enfoque que sugiere @Fogmeister, cada uno de mis esquemas de prueba ahora establece una variable de entorno que puedo verificar.
Luego, aquí hay un código que tengo en una clase llamada APPSTargetConfiguration
que puede responderme esta simple pregunta.
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];
}
La única advertencia con este enfoque es que si ejecuta una prueba desde el esquema de su aplicación principal, como XCTest le permitirá hacer (es decir, sin seleccionar uno de sus esquemas de prueba), no obtendrá este conjunto de variables de entorno.