2016-04-17 13 views
0

Ich habe ein seltsames Verhalten bei der Verwendung XCTest zu überprüfen, ob ein Fehler ausgelöst wird. Ich habe eine Methode dispose() aufgerufen, das wie folgt aussieht werfen kann:XCTest Ausgabe zeigt Fehler, aber kein Fehler ausgelöst

func dispose() throws 

ich einen Komponententest in XCTest schrieb, die wie folgt aussieht:

func testDispose() { 

    do { 
     // sound is properly initialized during setUp() 
     try sound.dispose() 
    } catch { 
     XCTFail("Error thrown.") 
    } 
} 

Der einzige Zweck des Tests zu prüfen ist, ob Es wird ein Fehler ausgegeben, wenn ein ordnungsgemäß initialisiertes Objekt freigegeben wird, von dem bekannt ist, dass es sich in einem gültigen Status befindet.

Der Test besteht, aber in der Konsole bekomme ich folgende Ausgabe:

Test Case '-[LVGSwiftSystemSoundServices_Tests.SystemSoundTypeTests testDispose]' started. 
System Sound Services Error: Unspecified error. 
    Message: An error occurred while disposing of the SystemSoundID. 
    Code: -1500 
Test Case '-[LVGSwiftSystemSoundServices_Tests.SystemSoundTypeTests testDispose]' passed (0.015 seconds). 

Die Linien, die mit SystemSoundServices Error:... sind die description des Fehlers beginnen, dass geworfen werden würde, wenn ein Fehler tatsächlich ausgelöst wurde. Mit anderen Worten, es wird ein Fehler erzeugt und seine Beschreibung wird auf die Konsole gedruckt, obwohl tatsächlich kein Fehler ausgegeben wird!

Ich kann es nicht herausfinden. Der Test wird bestanden, es wird kein Fehler ausgegeben, aber meine benutzerdefinierte Fehlermeldung wird auf der Konsole ausgegeben.

[EDIT 1]:

Dies ist der vollständige Code für die dispose() Methode:

public func dispose() throws { 
    try SystemSoundError.check(
     AudioServicesDisposeSystemSoundID(self.soundID), 
     message: "An error occurred while disposing of the SystemSoundID.") 
} 

Und für den Fall hilft es, die SystemSoundError.check(_:message:) Methode ist eine statische Methode auf einem ErrorType die wie folgt aussieht :

enum SystemSoundError: ErrorType, CustomStringConvertible { 

    // ... 

    public static func check(status: OSStatus, message: String) throws { 

     guard status == noErr 
      else { throw self.init(status: status, message: message) } 
    } 
} 

[Edit 2]: Pro Vorschlag @Lou Franco, habe ich versucht, die do-catch Blöcke aus der Entfernung Unit-Test, wie folgt aus:

func testDispose() { 
    try! sound.dispose() 
} 

bekomme ich das gleiche Ergebnis - die Testdurchgänge (natürlich - es gibt keine behauptet darin) und kein Fehler ausgelöst wird, aber ich immer noch die Fehlermeldung auf der Konsole ausgegeben bekommen .

[Bearbeiten 3]: Ich habe auch try dispose() innerhalb einer regulären Anwendung aufgerufen und kein Fehler wird ausgelöst, und keine Fehlermeldung wird auf der Konsole ausgegeben. Die Fehlermeldung wird nur in der Konsole XCTest ausgedruckt. Sehr eigenartig.

+0

Können Sie den Code innerhalb von 'sound.dispose()'? Ich frage mich, ob der Fehler bereits erwischt wird. – user212514

+0

Ich fügte den vollständigen Code für 'dispose()' hinzu, sowie den Fehlerprüfcode, der den Fehler tatsächlich auslösen würde. Ich bin mir ziemlich sicher, dass der Fehler nicht irgendwo in der Kette aufgefangen wird. –

+0

Entfernen Sie die Do/Catch/XCTFail - was passiert? –

Antwort

0

Ich habe es herausgefunden, obwohl es immer noch sehr seltsam ist. Wenn ich sound innerhalb des Unit-Tests testDispose() initialisiere, wird die Fehlermeldung nicht gedruckt.

Zuvor sah meine Testklasse etwas wie folgt aus:

class SystemSoundTypeTests: XCTestCase { 

    struct MySystemSound: SystemSoundType { 
     var soundID: UInt32 
    } 

    var sound: MySystemSound! 
    let frog = NSURL(fileURLWithPath: "/System/Library/Sounds/Frog.aiff") 

    override func setUp() { 
     super.setUp() 
     do { 
      sound = MySystemSound(soundID: try MySystemSound.open(frog)) 
     } catch { 
      print("\(error)") 
     } 
    } 
} 

Im Grunde hielt ich setup() mit einer sound Variable zu initialisieren, und stattdessen schaffe ich es in der Unit-Test:

func testDispose() { 

    do { 
     let sound = MySystemSound(soundID: try MySystemSound.open(frog)) 
     try sound.dispose() 
    } catch { 
     XCTFail("Error thrown.") 
    } 
} 

Wenn ich es innerhalb des Komponententests initialisiere, wird keine Nachricht auf die Konsole gedruckt.

Das ist ein merkwürdiger Fehler, weil ich ungefähr ein Dutzend andere Tests innerhalb der gleichen Klasse habe, von denen einige Test-Wurf-Funktionen haben, und keiner von ihnen handelte wie dieser.

+0

Melden Sie es dann Apple! – pbush25

Verwandte Themen