Estaba jugando con una simple prueba OCUnit para una aplicación de iPhone, y solo quería afirmar que el delegado de la aplicación era una instancia de la clase que esperaba. No esperaba que esta prueba fuera muy útil, pero resultó revelar un malentendido que tengo con respecto al Objetivo C.isKindOfClass y NSStringFromClass no están de acuerdo con UIApplicationDelegate
Primero obtengo una referencia al delegado. Luego registro el nombre de la clase de lo que regresa. En mi caso, la salida dice correctamente "el nombre de clase del delegado de la aplicación es CalculatorAppDelegate".
Sin embargo, la afirmación en la siguiente línea falla, y no entiendo por qué.
- (void)testAppDelegate
{
id appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class]));
NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]);
NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]);
NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]);
STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf");
}
qué circunstancias puede causar NSStringFromClass() para devolver el nombre de la clase correcta, mientras que isKindOfClass devuelve falso?
2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds).
Creé este proyecto nuevo en XCode4, y configuró automáticamente el objetivo de prueba de la unidad. Tengo bastantes pruebas con muchas afirmaciones que funcionan perfectamente. Es solo esta afirmación la que falla. ¿Podría seguir siendo así si mi objetivo no está configurado correctamente?Parece que no hay un objetivo CalculatorTesting, por lo que tal vez la afirmación anterior sea a la que se refieren como una prueba de aplicación que debe ejecutarse en un dispositivo. En una nota relacionada, las instrucciones en la página a la que vinculó no se corresponden con la forma en que XCode 4 establece los objetivos, creo. ¿Algún consejo sobre cómo hacer objetivos en 4? – pohl
Estoy bastante seguro de que no ha configurado sus objetivos correctamente. También estoy trabajando con Xcode 4 y he probado tu problema. En Xcode 4, debe seleccionar su objetivo de aplicación normal en la descripción general del proyecto y duplicarlo (Cmd-D). Llámalo CalculatorTesting y agrega el objetivo de la prueba OCUnit como dependencia. Establezca el esquema activo para que sea su nuevo objetivo y edite este esquema. Seleccione Prueba a la izquierda y agregue su paquete de prueba allí. Ahora puede ejecutar sus pruebas de aplicación con Cmd-U. – Felix
Gracias por prestarme su tiempo. Cuando edito mi esquema, y miro bajo la sección de Prueba, puedo ver que mi paquete CalculatorTests está en la lista correcta, y muestra las clases de prueba y los métodos que he definido. Para ser claros: ya puedo ejecutar mis pruebas unitarias con Cmd-U. Tengo 11 métodos de prueba que contienen un total de 38 afirmaciones, y todas funcionan correctamente ... a excepción de esta. Si no tuviera un objetivo de prueba configurado correctamente, ¿se podrían haber ejecutado los mensajes NSLog() que he pegado en mi pregunta? – pohl