2010-04-11 227 views
5

命中的情况下(让我们假设我有很好的理由不要删除我的NSAssert()检查在我的代码,只是因为我也做单元测试。)我如何测试NSAssert使用iPhone的单元测试框架

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

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

这是模拟器中的SDK 3.1.3。

这是一个框架中的错误,或者有什么我可以做的更好地做到这一点,即NSAssert抛出一个单元测试宏可以捕获的适当的异常?

回答

1

我拍得太快了。

原来,问题是其他地方:

将含有该解雇不是NSOject的子类的NSAssert类。这是直到现在还好,因为它只包含类方法,没有实例方法。但是当NSAssert命中时,它想要得到它所在代码的类名,并且缺少该方法。使这个类成为NSObject的一个子类来修复它,现在NSAssert确实会抛出一个可以被STAssertThrows测试的异常。

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

所以,虽然这是一个悬而未决的问题,我希望至少这个解释是哪天帮助别人,也许:)

我不介意这个问答中删除,不过,无论是。