如何使用iPhone的单元测试框架测试NSAssert命中案例

Tho*_*ann 5 iphone unit-testing

(假设我有充分的理由不在我的代码中删除我的NSAssert()检查,因为我也在进行单元测试.)

在我的单元测试代码中,我喜欢确保在我调用它时代码中的NSAssert命中(断言).因此,在调用执行断​​言的代码时,我使用STAssertThrows()宏.

问题是:尽管文档说NSAssert会抛出异常,但单元测试运行将停止,并显示错误消息,说明应用程序崩溃了.

这是模拟器中的SDK 3.1.3.

这是框架中的错误还是我可以做些什么来使这项工作更好,即NSAssert会抛出单元测试宏可以捕获的正确异常?

Tho*_*ann 1

我射得太快了。

事实证明问题出在其他地方:

包含触发的 NSAssert 的类不是 NSOject 的子类。到目前为止这还可以,因为它只包含类方法,没有实例方法。但是当 NSAssert 命中时,它想要获取它所在代码的类名,而该方法丢失了。使这个类成为 NSObject 的子类修复了这个问题,现在 NSAssert 确实抛出了一个异常,可以通过 STAssertThrows 进行测试。

我通过在崩溃前查看单元测试日志中的警告发现了这一点:它警告说找不到 methodSignatureForSelector 和 doesNotRecognizeSelector。添加这些并打印出他们正在寻找的选择器(NSLog(@"sel:%s", aSelector);)后,我发现它正在寻找“类”方法。然后我意识到发生了什么事。

因此,虽然这是一个没有实际意义的问题,但我希望至少这个解释有一天能够帮助某人,也许:)

不过,我也不介意删除这个 q。