Este problema me estaba volviendo loco, pero pude obtener NSLocalizedString
para comportarse.
zoul tenía razón, si imprime el paquete principal en la consola en una prueba lógica, no es el mismo paquete que contiene su archivo Localizable.strings. Necesita redefinir condicionalmente NSLocalizedString
siempre que ejecute las pruebas de su unidad. Lo hice en los siguientes pasos:
- Necesitamos una forma de saber cuando estamos en nuestro objetivo de las pruebas de lógica, por lo que añadir algo como LOGIC_TESTS al ajuste
Preprocessor Macros
construir su pruebas lógicas de destino.
Sólo hay 1 lugar en mi código donde necesito redefinir NSLocalizedString
, así que pude colocar el siguiente código en el encabezado correspondiente a esa clase. Si tienes este problema en varios lugares, te sugiero que pongas el siguiente código en un encabezado y #include
, donde sea que lo necesites (traté de usar un archivo .pch pero no funciona en las pruebas lógicas). De todos modos, colocar esto en alguna parte en la cabecera de la clase (s) que utilizan NSLocalizedString
:
#ifdef LOGIC_TESTS
#undef NSLocalizedString
#define NSLocalizedString(key, comment) [[NSBundle bundleWithIdentifier:@"YOUR_IDENTIFIER"] localizedStringForKey:(key) value:@"" table:nil]
#endif
Reemplazar YOUR_IDENTIFIER
con el paquete identificador de paquete de la aplicación (que se encuentra en su archivo Info.plist
, clave es CFBundleIdentifier
). Esto asume que ha definido LOGIC_TESTS
como macro del preprocesador solo en su objetivo de Pruebas lógicas.
editar: Curiosamente, una vez que eliminé algún código de depuración, esta solución dejó de funcionar. Parece que tienes que engañar a Xcode para que cargue el paquete también. A continuación se hace:
NSString *path = @"path_to_main_bundle";
NSBundle *bundle = [NSBundle bundleWithPath:path];
NSLog(@"bundles: %@", [NSBundle allBundles]);
Dónde path_to_main_bundle
es == [[NSBundle mainBundle] bundlePath]
al ejecutar su principal objetivo. Simplemente inicie sesión una vez en gdb o use NSLog
en su delegado de la aplicación para tomar la ruta. Debería verse como /Users/YOUR_USER_NAME/Library/Application Support/iPhone Simulator/4.1/Applications/UUID_LOTS_OF_LETTERS_AND_NUMBERS_HERE/App.app
.
Coloqué ese código en la llamada setUp para una de mis clases de prueba lógica. Y no, no tengo idea de por qué tengo que registrar todos los paquetes para que funcione, por lo que cualquier persona que tenga una pista, ¡por favor hágamelo saber!
Tiene que haber una forma más elegante de hacerlo, pero tengo otras cosas en las que necesito trabajar. Sospecho que la verdadera solución es encontrar una manera de localizar los recursos del paquete sin una extraña codificación e introspección. – kevboh
¡Amigo! Gracias por una respuesta tan detallada. Esto será de gran ayuda. Me sorprende que haya pocas personas que parezcan haber encontrado esto, tal vez no muchas personas que localizan la prueba unitaria. ;-) –
No hay problema. Sí, es extraño cómo no pude encontrar nada sobre este problema en el interwebs. Definitivamente déjame saber si descubres algo más sobre esto. – kevboh