2010-04-11 6 views
5

(Supponiamo che io ho buoni motivi per non rimuovere il mio NSAssert() controlla nel mio codice solo perché sto anche facendo Unit testing.)Come posso provare per NSAssert colpito casi utilizzando il framework Unit Testing di iPhone

Nel mio codice di test dell'unità, mi piace assicurarmi che un NSAssert nel mio codice raggiunga (asserisce) quando lo invoco. Pertanto utilizzo la macro STAssertThrows() quando si chiama il codice che fa l'asserzione.

Il problema è: nonostante la documentazione dicendo che NSAssert sarebbe un'eccezione, l'esecuzione di test di unità si fermerà con un msg di errore che dice l'app si è schiantato.

questo è con SDK 3.1.3 nel simulatore.

Si tratta di un bug nel framework o c'è qualcosa che posso fare per farlo funzionare meglio, cioè in modo che NSAssert generi un'eccezione appropriata che la macro di test dell'unità può rilevare?

risposta

1

ho sparato troppo in fretta.

scopre che il problema era da qualche altra parte:

La classe che conteneva il NSAssert che ha sparato non era una sottoclasse di NSOject. Questo era OK fino ad ora perché conteneva solo metodi di classe, nessun metodo di istanza. Ma quando colpisce NSAssert, vuole ottenere il nome della classe del codice in cui si trova e quel metodo è mancante. Rendendo questa classe una sottoclasse di NSObject l'ha corretto, e ora NSAssert lancia in effetti un'eccezione che può essere verificata da STAssertThrows.

L'ho rilevato osservando gli avvisi nel registro di verifica dell'unità subito prima dello schianto: Avvisava che non riusciva a trovare methodSignatureForSelector e doesNotRecognizeSelector. Dopo aver aggiunto queste e stampare il selettore che stanno cercando (NSLog(@"sel:%s", aSelector);), ho scoperto che stava cercando il metodo di "classe". Poi ho capito cosa stava succedendo.

Così, mentre questa era una questione controversa, spero che almeno questa spiegazione sta aiutando qualcuno, un giorno, forse :)

non mi dispiace avere questo q cancellato, però, neanche.