2012-03-15 14 views
6

Estoy creando una biblioteca estática para iOS y estoy tratando de obtener datos de cobertura de código para sus pruebas unitarias. Estoy usando CoverStory para visualizar los archivos de cobertura de código generados.Resultados de cobertura de código incorrectos en XCode al probar excepciones

Obtengo la información correcta para la mayoría de las pruebas.

Sin embargo, cualquier prueba que verifique que se debe lanzar una excepción no se marca como probada.

Por ejemplo el método

- (void)shouldThrow:(BOOL)throw { 

    if (throw) 
     @throw [NSException exception...]; 

    NSLog(@"not thrown"); 

} 

Probado con la prueba

- (void)testShouldThrow { 
    STAssertThrows([myObject shouldThrow:YES], @"Should have thrown an exception"); 

    STAssertNoThrow([myObject shouldThrow:NO], @"Should not have thrown an exception"); 
} 

pasa todas las pruebas (es decir, la excepción es que es lanzado correctamente). Sin embargo, la cobertura del código no se muestra al 100%: la línea con @throw activada no está marcada como probada.

¿Alguna idea?

Respuesta

3

La línea con @throw en ella no se completa (porque se lanza la excepción), por lo que no se marca como cubierta. Podrías presentar un error, pero esto es bastante difícil de solucionar. Si se trata de una sola línea en una declaración de sucursal, puede ser muy difícil saber si fue probada, pero si hay líneas antes de que se hayan ejecutado, solo tendrá que suponer que fue así.

Lo malo es que nunca podrás llegar al 100%.

+0

Eso es lo que le tenía miedo :((He establecido puntos de interrupción en la línea, así que sé que está siendo probado, pero sería bueno poder automatizar esa prueba). – deanWombourne

0

El problema aún peor es que parece que los contadores de las líneas antes del @throw en el mismo bloque de condición tampoco son coveralbe. Por lo tanto, simplemente escriba el código antes de @throw ya que un marcador no ayudará al problema.

Sin embargo,, encontré que las condiciones que incluyen variables ("if (YES)", "if (1 == 1)" no están en los casos) son siempre coaparables. Por lo tanto, una cosa complicada que podríamos hacer es definir primero una variable de condición trivial y luego agregar una prueba de condición que incluya esa variable antes de @throw.

static BOOL __trivialYES = YES; //for cover @throw, and never use 'const' 

continuación

if(__trivialYES) @throw ...; 

Esto si ayuda a que el problema y para su conveniente, usted puede definir su propia macro para hacer estas cosas.

#define #throw if (__trivialYES) 

y luego la sentencia throw:

#throw ...; 

y esto hace probablemente el trabajo de prueba de cobertura mejor.

PD: el '#throw' es solo un macro de ejemplo. Es lo mismo que otras macro. El '#' solo es un caracterizador válido (para algunos precompiladores), que lo hace parecer especial.

Cuestiones relacionadas