Determinar o teste / alvo de produção programaticamente

Obrigado aos grandes caras da objc.io por sua postagem sobre o teste do controlador de visualização para esta dica.

Ao executar testes de unidade no Xcode, você deseja que seu aplicativo seja iniciado no simulador ou em um dispositivo, mas você não precisa de nada mais do que o pacote para ser carregado. Você não precisa que o controlador de visualização raiz do seu aplicativo seja iniciado e adicionado à janela, por exemplo. Esse comportamento pode contaminar seus testes se, digamos, objetos gerenciados forem salvos em dados de núcleo e seus testes dependerem da propagação de dados de núcleo de uma forma de controlador em suas setUpchamadas.

Portanto, a solução é aumentar o delegado do aplicativo da seguinte forma:

// Helper function to see if we are running the production target or the test target
static BOOL isRunningTests(void) __attribute__((const));
static BOOL isRunningTests(void) {
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
NSString* injectBundle = environment[@"XCInjectBundle"];
return [[injectBundle pathExtension] isEqualToString:@"octest"];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

if (isRunningTests()) {
return YES;
}

// Normal logic here
}