XCTest 输出显示错误但未抛出错误

Posted

技术标签:

【中文标题】XCTest 输出显示错误但未抛出错误【英文标题】:XCTest output shows error but no error thrown 【发布时间】:2016-04-17 13:17:19 【问题描述】:

我在使用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 内的控制台。很奇怪。

【问题讨论】:

你能分享sound.dispose()里面的代码吗?我想知道错误是否已经被捕获。 我添加了dispose() 的完整代码,以及实际上会引发错误的错误检查代码。我很确定这个错误不会在链条的任何地方被发现。 删除 do/catch/XCTFail -- 会发生什么? 我删除了它们,并使用了try! dispose() 并得到了相同的结果。我编辑了我的问题以显示代码。 【参考方案1】:

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

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

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

当我在单元测试中初始化它时,控制台不会打印任何消息。

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

【讨论】:

那就报告给苹果吧!

以上是关于XCTest 输出显示错误但未抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

POST 方法不起作用但未显示任何错误

第一个 epoch 完成后模型训练卡住了……第二个 epoch 甚至不会开始,也不会抛出任何错误,它只是保持空闲

未抛出 spring webflux 的自定义异常

对话框片段已添加异常未抛出

我在颤动中的捕获错误没有按我想要的那样工作。我想在出现错误但未显示时显示错误消息

Eclipse项目文件夹显示错误但未在文件夹内的任何文件中显示错误