Las testings de OCUnit fallan en la línea de command pero funcionan en Xcode cuando se usan los services de Keychain

Estoy usando SFHFKeychainUtils para usar los services de llavero en mi aplicación. He escrito algunas testings OCUnit que verifican la funcionalidad de este código. Todo funciona bien cuando ejecuto las testings de unidad de Xcode en el simulador de iOS o en mi dispositivo. Sin embargo, ahora estoy tratando de configurar un server CI y la testing falla cuando se ejecuta a través de la línea de command con el código de error -25291. Mirando eso en la documentation de Apple me dice: No hay resultados de confianza disponibles (errSecNotAvailable). He vinculado Security.framework a mi proyecto de testing de unidad, parece que por lo que he leído en la web, esto es todo lo que debería necesitar para que esto funcione. Aquí está el command que invoco en la console:

/usr/bin/xcodebuild -target [Test_Target] -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/ -configuration Debug

¿Alguien tiene alguna experiencia o sugerencia para que las testings unitarias y los Servicios de llavero se jueguen bien juntos desde la línea de command?

Me encontré con el mismo problema, y ​​la solución para mí era asegurarme de que el simulador se estaba ejecutando antes de comenzar cualquier testing. Hice eso usando AppleScript en una fase de compilation de Run Script en Xcode, y básicamente lo mismo en el server de CI. Aquí está el script de shell que abrirá el simulador:

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

El problema de los services de security / llavero que causa esto es aparentemente un problema conocido, aunque todavía no tengo el radar que lo rastrea. Si está utilizando Jenkins, coloque el script anterior en una fase Execute Shell antes de la fase de compilation de Xcode. Si está controlando esto a través de Xcode, colóquelo en una fase de compilation de Run Script antes de la fase de compilation RunUnitTests Run Script. ¡Espero que resuelva tu problema!

No pude averiguar por qué falla el acceso de llavero cuando se ejecutan las testings OCUnit desde la command-line.

Para continuar con mis testings, agregué una categoría hacktastic a mi objective de testing de unidad:

 // // SFHFKeychainUtils+UnitTestHacks.m // CB30 // // GRRR!!! http://stackoverflow.com/questions/9996578/ocunit-tests-fail-from-the-command-line-but-work-in-xcode-when-using-keychain-se // // Created by Joshua Vickery on 5/14/12. // #import "SFHFKeychainUtils+UnitTestHacks.h" static NSMutableDictionary *fakeKeyChainHolder; @implementation SFHFKeychainUtils (UnitTestHacks) + (NSMutableDictionary *)fakeKeyChainForServiceName:(NSString *)serviceName { if (nil == fakeKeyChainHolder) { fakeKeyChainHolder = [NSMutableDictionary dictionary]; } NSMutableDictionary *fakeKeyChain = [fakeKeyChainHolder objectForKey:serviceName]; if (nil == fakeKeyChain) { fakeKeyChain = [NSMutableDictionary dictionary]; [fakeKeyChainHolder setObject:fakeKeyChain forKey:serviceName]; } return fakeKeyChain; } #pragma clang diagnostic push #pragma clang diagnostic ignonetworking "-Wobjc-protocol-method-implementation" + (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error { [[self fakeKeyChainForServiceName:serviceName] removeObjectForKey:username]; return YES; } + (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error { [[self fakeKeyChainForServiceName:serviceName] setObject:password forKey:username]; return YES; } + (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error { return [[self fakeKeyChainForServiceName:serviceName] objectForKey:username]; } #pragma clang diagnostic pop @end 

Tenga en count que esta no es una buena solución, sino una solución para que las testings unitarias funcionen hasta que se encuentre una solución mejor.

Estoy experimentando un problema similar. Según mi investigación, esto podría networkingucirse a la versión del simulador que se ejecuta cuando se ejecutan las testings. El llavero de testing de unidad con simulador de iPhone 6.0 arriba siempre hará que mis testings fallen, si se ejecuta desde la línea de command. Cámbielo a cualquier otra versión (4.3, 5.0, 5.1) y pasan. Siempre bueno desde XCode con cualquier versión.

Tal vez este es un problema de herramientas de línea de command que no está configurando algunos indicadores necesarios antes de ejecutar testings.

Aquí abrí una nueva pregunta con un pequeño caso de testing: la API de services de Keychain falla con errSecNotAvailable en iphonesimulator 6.0