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 输出显示错误但未抛出错误的主要内容,如果未能解决你的问题,请参考以下文章
第一个 epoch 完成后模型训练卡住了……第二个 epoch 甚至不会开始,也不会抛出任何错误,它只是保持空闲