2011-03-19 9 views
12

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). 

Respuesta

11

No ha configurado su objetivo de prueba correctamente. Si siguió this guide for unit testing applications, debe tener 3 objetivos: Calculadora, CalculatorTests y CalculatorTesting. Compruebe la sección 'fases de compilación' en CalculatorTests. En 'Compilar orígenes', solo los archivos fuente SenTestCase deben aparecer allí. Supongo que agregó CalculatorAppDelegate.m y otros archivos allí; esto daría lugar a ensamblados duplicados de los mismos archivos fuente que luego se vinculan a la misma aplicación cuando genera el objetivo CalculatorTesting. Eso explica por qué tus afirmaciones fallan.

EDIT: di cuenta de que no es necesario el CalculatorTesting objetivo en Xcode 4. Sólo tienes que ir a Proyecto> Editar Esquemas ... y asegúrese de que el paquete de prueba de la unidad aparece en la sección deprueba . Luego puede ejecutar pruebas unitarias con Cmd-U.

+0

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

+1

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

+0

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

1

intentar cerrar la sesión cuál es el valor de retorno de la operación

NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 

e incluso se puede probar si es un miembro de:

NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 

no está seguro de si ayudará, pero es una punto de inicio

+0

¿es amable? 0 es miembro? 0 – pohl

+1

intente '[clase de appDelegate] == [clase de CalculatorAppDelegate]' por favor –

+1

Buena idea. El resultado es 0 para 'NSLog (@"% i ", [claseDelegategate] == [CalculatorAppDelegate class]);' – pohl

Cuestiones relacionadas