2016-04-18 11 views
5

Come si scrivono i test per i metodi Swift che presentano le condizioni preliminari? Ecco un esempio:Test del codice Swift con le precondizioni

func doublePositive(n:Int) -> Int { 
    precondition(n >= 0) 
    return 2*n 
} 

Utilizzando XCTAssertThrowsError non funziona:

func testDoublePositive() { 
    XCTAssertEqual(10, testObject.doublePositive(5)) // Works 
    XCTAssertThrowsError(testObject.doublePositive(-1)) // Breaks 
} 

Questo genera un errore durante l'esecuzione del test:

filettatura 1: EXEC_BAD_INSTRUCTION (Codice = EXCI386_INVOP, Subcode = 0x0)

C'è un modo per testare i precondi di Swift?

+2

non c'è un modo standard per "catturare" il fallimento in precondizione, si fermerà sempre il programma, tuttavia ci sono alcune modifiche, date un'occhiata a http://www.cocoawithlove.com/blog/2016/02/02 /partial-functions-part-two-catching-precondition-failures.html – ogres

+0

@ogres Wow, questo è un bell'articolo, grazie! – dasblinkenlight

+0

Non vedo l'ora di vederlo nel codice non test. Sono contento che questo ti permetta di testare ciò che stai cercando di testare, ma odio quel sito web ... perché garantisco che c'è qualcuno che lo implementa nel loro target principale e thread interrotti orfani solo per evitare che l'app si arresti in modo anomalo ... (E lo dico, perché l'ho visto accadere per il loro simile articolo Objective-C ...) – nhgrif

risposta

3

È possibile testare i metodi Swift che presentano condizioni preliminari, testando solo il comportamento con input che soddisfano tali condizioni preliminari. Il comportamento quando non è soddisfatta la precondizione è chiaro senza ulteriori verifiche, poiché le precondizioni vengono elaborate nella libreria standard.

Se si sospetta di aver specificato correttamente una precondizione, è possibile estrarre l'espressione di precondizione in una funzione booleana, quindi verificare che per correttamente discernere valido da input non validi.

Tuttavia, è possibile creare per voi stessi ciò che si desidera qui:

un'opzione per generare eccezioni fallimenti precondizione/asserzione farebbe il trucco: si potrebbe accenderlo in build di debug, e trasformarlo fuori nelle versioni di rilascio.

Invece di chiamare di precondition di Apple, è possibile scrivere la propria funzione, dicono, require. Questo potrebbe essere condizionatamente compilato per agire come desideri. Dovresti usare questo ovunque dovresti usare altrimenti precondition.

+0

Fare una mia funzione è una buona idea, grazie! – dasblinkenlight

Problemi correlati