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.
Können Sie den Code innerhalb von 'sound.dispose()'? Ich frage mich, ob der Fehler bereits erwischt wird. – user212514
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. –
Entfernen Sie die Do/Catch/XCTFail - was passiert? –