Resultados de cobertura de códigos incorrectos en XCode al probar excepciones

Estoy creando una biblioteca estática para iOS y estoy tratando de get datos de cobertura de código para sus testings unitarias. Estoy usando CoverStory para visualizar los files de cobertura de código generados.

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

Sin embargo, cualquier testing que verifique que se debe lanzar una exception 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 testing

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

Pasa todas las testings (es decir, la exception se está lanzando correctamente). Sin embargo, la cobertura del código no muestra el 100%; la línea con @throw on no está marcada como probada.

¿Algunas ideas?

La línea con @throw no se completa (porque se lanza la exception), por lo que no se marca como cubierta. Podría presentar un error, pero es probable que esto les resulte bastante difícil de solucionar. Si se trata de una sola línea en una instrucción de sucursal, puede ser muy difícil saber si se probó, pero si hay líneas antes de ejecutarlo, solo tendrás que asumir que así fue.

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

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, escribir código simplemente antes de @throw como marcador no va a ayudar al problema.

Sin embargo , encontré que las condiciones que incluyen variables ("si (SÍ)", "si (1 == 1)" no están en los casos) siempre se pueden cubrir. Por lo tanto, una cosa delicada que podríamos hacer es primero definir una variable de condición trivial y luego agregar una testing de estado que incluya esa variable antes de @throw.

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

entonces

 if(__trivialYES) @throw ...; 

Esto debería ayudar al problema y, para su conveniencia, puede definir su propia macro para hacer estas cosas.

 #define #throw if (__trivialYES) 

y luego la statement de tiro:

 #throw ...; 

y esto probablemente haga que la testing de cobertura funcione mejor.

PS: el '#throw' es solo una macro de ejemplo. Es lo mismo que otra macro. El '#' simplemente un carácter válido (para algunos precomstackdores), que lo hace parecer especial.