Tho*_*ann 5 iphone unit-testing
(假设我有充分的理由不在我的代码中删除我的NSAssert()检查,因为我也在进行单元测试.)
在我的单元测试代码中,我喜欢确保在我调用它时代码中的NSAssert命中(断言).因此,在调用执行断言的代码时,我使用STAssertThrows()宏.
问题是:尽管文档说NSAssert会抛出异常,但单元测试运行将停止,并显示错误消息,说明应用程序崩溃了.
这是模拟器中的SDK 3.1.3.
这是框架中的错误还是我可以做些什么来使这项工作更好,即NSAssert会抛出单元测试宏可以捕获的正确异常?
我射得太快了。
事实证明问题出在其他地方:
包含触发的 NSAssert 的类不是 NSOject 的子类。到目前为止这还可以,因为它只包含类方法,没有实例方法。但是当 NSAssert 命中时,它想要获取它所在代码的类名,而该方法丢失了。使这个类成为 NSObject 的子类修复了这个问题,现在 NSAssert 确实抛出了一个异常,可以通过 STAssertThrows 进行测试。
我通过在崩溃前查看单元测试日志中的警告发现了这一点:它警告说找不到 methodSignatureForSelector 和 doesNotRecognizeSelector。添加这些并打印出他们正在寻找的选择器(NSLog(@"sel:%s", aSelector);
)后,我发现它正在寻找“类”方法。然后我意识到发生了什么事。
因此,虽然这是一个没有实际意义的问题,但我希望至少这个解释有一天能够帮助某人,也许:)
不过,我也不介意删除这个 q。