XCTest输出显示错误但没有抛出错误

时间:2016-04-17 13:17:19

标签: swift testing error-handling xctest

使用XCTest检查是否抛出错误时,我遇到了一种奇怪的行为。我有一个名为dispose()的方法可以抛出如下所示:

func dispose() throws

我在XCTest中编写了一个单元测试,如下所示:

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 如果实际发生了错误。换句话说,即使没有实际抛出错误,也会创建错误并将其描述打印到控制台!

我无法理解。测试通过,不会抛出任何错误,但我的自定义错误消息将打印到控制台。

[编辑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 Franco的建议,我尝试从单元测试中删除do-catch块,如下所示:

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

我得到相同的结果 - 测试通过(当然 - 其中没有断言)并且没有抛出错误,但我仍然将错误消息打印到控制台。

[编辑3]:我还在常规应用程序中调用了try dispose(),并且没有抛出任何错误,并且没有错误消息打印到控制台。错误消息仅打印到XCTest内的控制台。很奇怪。

1 个答案:

答案 0 :(得分:0)

我想通了,虽然它仍然很奇怪。如果我在sound单元测试中初始化testDispose(),则不会打印错误消息。

以前,我的测试类看起来像这样:

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

基本上,我停止使用setup()来初始化sound变量,而是在单元测试中创建它:

func testDispose() {

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

当我在单元测试中初始化它时,没有消息打印到控制台。

这是一种奇怪的错误,因为我在同一个类中有大约十几个其他测试,其中一些测试抛出函数,而且没有一个像这样。