2016-04-18 21 views
5

Wie schreibt man Tests für Swift-Methoden, die Vorbedingungen haben? Hier ein Beispiel:Testen von Swift-Code mit Vorbedingungen

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

XCTAssertThrowsError Mit funktioniert nicht:

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

Dies erzeugt einen Fehler, wenn die Durchführung des Tests:

Gewinde 1: EXEC_BAD_INSTRUCTION (Code = EXCI386_INVOP, Subcode = 0x0)

Gibt es eine Möglichkeit, Precondi zu testen von Swift?

+2

es gibt keinen Standard Weg, um Fehler in der Vorbedingung zu "fangen", es wird immer das Programm stoppen, es gibt jedoch einige Verbesserungen, schauen Sie sich http://www.cocoaithllove.com/blog/2016/02/02 /partial-functions-part-two-catching-precondition-failures.html – ogres

+0

@ogres Wow, das ist ein schöner Artikel, danke! – dasblinkenlight

+0

Ich kann es kaum erwarten, dies in Nicht-Test-Code zu sehen. Ich bin froh, dass du damit testen kannst, was du versuchst zu testen, aber ich hasse diese Website ... weil ich garantiere, dass jemand dies in ihren Hauptziel und verworfenen Threads implementiert, nur um zu verhindern, dass die App abstürzt ... (Und ich sage das, weil ich es für ihren ähnlichen Objective-C-Artikel gesehen habe ...) – nhgrif

Antwort

3

Sie testen Swift-Methoden mit Vorbedingungen, indem Sie nur das Verhalten mit Eingaben testen, die diese Voraussetzungen erfüllen. Das Verhalten, wenn die Vorbedingung nicht erfüllt ist, ist ohne weitere Tests klar, da die Vorbedingungen in die Standardbibliothek übernommen werden.

Wenn Sie bezweifeln, dass Sie eine Vorbedingung richtig angegeben haben, können Sie den Vorbedingungsausdruck in eine Boolesche Funktion zurückziehen und dann testen, um gültig von ungültigen Eingaben zu unterscheiden.

Sie können jedoch für sich selbst erstellen, was Sie hier wünschen:

Eine Option Ausnahmen Voraussetzung/Assertionsfehler zu erzeugen, würde der Trick: man würde es einschalten in Debug-Builds, und schalten Sie ihn in Release-Builds deaktiviert.

Statt Aufruf von Apple precondition, können Sie Ihre eigene Funktion schreiben, sagen, require. Dies könnte bedingt nach Ihren Wünschen zusammengestellt werden. Sie würden das dann überall verwenden, wo Sie sonst precondition verwenden würden.

+0

Meine eigene Funktion machen ist eine gute Idee, danke! – dasblinkenlight