2016-04-17 26 views
0

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のコンソールにのみ出力されています。非常に奇妙な。

+0

あなたは 'sound.dispose()'の中でコードを共有できますか?私は、エラーが既にキャッチされているかどうか疑問に思っています。 – user212514

+0

私は 'dispose()'の完全なコードと実際にエラーをスローするエラーチェックコードを追加しました。私は間違いなくチェーンのどこにでも犯されていないと確信しています。 –

+0

do/catch/XCTFailを削除します。どうなりますか? –

答えて

0

私はそれを理解しましたが、それはまだ非常に奇妙です。 testDispose()ユニットテストの中でsoundを初期化すると、エラーメッセージは表示されません。私はsound変数を初期化するためにsetup()を使用して停止し、代わりに私はユニットテストの内側にそれを作成し、基本的に

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)") 
     } 
    } 
} 

以前は、私のテストクラスは、このような何かを見

func testDispose() { 

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

ユニットテストの内部で初期化すると、コンソールにメッセージは出力されません。

これは私が同じクラスの中で約1ダースのテストをしているため、いくつかの種類の奇妙なバグです。そのうちのいくつかはテスト機能を投げますが、どれもそのような振る舞いはありません。

+0

それをAppleに報告してください! – pbush25

関連する問題