XCTest
を使用してエラーがスローされているかどうかを確認する際に奇妙な現象が発生します。私はこのようになります投げることができるdispose()
と呼ばれる方法があります:私はこのようになりますことXCTest
でユニットテストを書いた XCTest出力にエラーが表示されますが、エラーはスローされません。
func dispose() throws
:
テストの唯一の目的は、かどうかをテストすることです
func testDispose() {
do {
// sound is properly initialized during setUp()
try sound.dispose()
} catch {
XCTFail("Error thrown.")
}
}
有効な状態にあることがわかっている正しく初期化されたオブジェクトを破棄すると、エラーがスローされます。
テストに合格したが、コンソールに、私は次のような出力が得られます。
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).
SystemSoundServices Error:...
で始まる行は、エラーが実際にスローされた場合はを投げられるであろうと、エラーのdescription
です。つまり、実際にエラーが発生していなくても、エラーが作成され、その説明がコンソールに出力されます。
私はそれを理解できません。テストに合格し、エラーはスローされませんが、カスタムエラーメッセージがコンソールに出力されます。
は、[EDIT 1]:
これはdispose()
メソッドの完全なコードです:
public func dispose() throws {
try SystemSoundError.check(
AudioServicesDisposeSystemSoundID(self.soundID),
message: "An error occurred while disposing of the SystemSoundID.")
}
そして場合には、それはSystemSoundError.check(_:message:)
方法は次のようになりErrorType
上の静的メソッドである、ことができます:
enum SystemSoundError: ErrorType, CustomStringConvertible {
// ...
public static func check(status: OSStatus, message: String) throws {
guard status == noErr
else { throw self.init(status: status, message: message) }
}
}
[編集2]:@Louフランコの提案あたり、私はからdo-catch
ブロックを削除しようとしました - ( - 何もそれにアサートがないもちろん)とエラーがスローされないが、私はまだコンソールに印刷されたエラーメッセージを取得されたテストパス
func testDispose() {
try! sound.dispose()
}
私は同じ結果が得られます。このようなユニットテスト、 。
[編集3]:また、通常のアプリケーション内にtry dispose()
を呼び出しましたが、エラーはスローされず、エラーメッセージもコンソールに出力されません。エラーメッセージはXCTest
のコンソールにのみ出力されています。非常に奇妙な。
あなたは 'sound.dispose()'の中でコードを共有できますか?私は、エラーが既にキャッチされているかどうか疑問に思っています。 – user212514
私は 'dispose()'の完全なコードと実際にエラーをスローするエラーチェックコードを追加しました。私は間違いなくチェーンのどこにでも犯されていないと確信しています。 –
do/catch/XCTFailを削除します。どうなりますか? –