我编写了一个 OCUnit 测试,在 Xcode 3.2 中运行良好,现在在 Xcode 4 中遇到问题。它测试单个静态函数X
在班上A
,它不调用任何类或函数(库函数之外)。唯一需要调用的其他代码是静态构造函数,它初始化两个静态变量,但同样,这些是不调用任何其他类或类的函数的硬编码值(数组)A
.
然而,我必须包含它导入的所有类的 .m、.mm 和 .c 文件,以及它们导入的等等,以解决_OBJC_CLASS_$_ClassB”,引用自:错误。我不记得必须在 Xcode 3 中执行任何操作,但是很好,没问题,我可以编译它。现在,我收到来自课堂的错误B
's +[B initialize]
.
为什么在未以任何方式引用的类上调用静态构造函数?我怎样才能解决这个问题,最好不改变我的课程来适应测试?
Update
为了进一步弄清楚发生了什么,我注释掉了所有测试用例和#import "A.h"
看看会发生什么。我添加了一个简单的单元测试:
- (void) testSomething {
STAssertTrue(NO, @"did it work?");
}
Still, my +[B initialize]
被调用并失败。看来 OCUnit 正在爬行我所有的类,并且它们+initialize
在此过程中会调用方法。这对我来说毫无意义 - 我怎样才能禁用这种行为?
这是调用我自己的代码之前的堆栈跟踪,以防有帮助:
#7 _class_initialize ()
#8 prepareForMethodLookup ()
#9 lookUpMethod ()
#10 objc_msgSend ()
#11 +[NSObject(SenTestRuntimeUtilities) senIsASuperclassOfClass:] ()
#12 +[NSObject(SenTestRuntimeUtilities) senAllSubclasses] ()
#13 +[SenTestSuite updateCache] ()
#14 +[SenTestSuite suiteForBundleCache] ()
#15 +[SenTestSuite testSuiteForBundlePath:] ()
#16 +[SenTestProbe specifiedTestSuite] ()
#17 +[SenTestProbe runTests:] ()
#18 <????> ()
#19 <????> ()
#20 <????> ()
#21 <????> ()
我在使用 xcode 4 和我的单元测试套件时也遇到了很多问题。
我必须查看您的源代码才能了解您的情况,但 OCUnit 确实通过类反射做了很多事情。这就是它运行以“test”开头的方法的方式。因此,它检查您的类,导致其类初始值设定项触发,这是有道理的。
我知道这可能不是您正在寻找的答案,但是如果 B 的 +initialize 中的错误是因为它依赖于某种预期的应用程序状态,那么您可能真的需要考虑重构 +initialize。由于这个确切的原因,它不应该依赖于类本身之外的任何东西......你无法保证它何时会触发或事物将处于什么状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)