我编写了一个OCUnit测试,在Xcode 3.2中运行良好,现在我在Xcode 4中遇到了问题。它在类X
中测试一个静态函数A
,不调用任何类或函数(库函数之外)。唯一需要调用的其他代码是静态构造函数,它初始化两个静态变量,但同样,那些是不调用任何其他类的硬编码值(数组),或类A
的函数。
然而,我必须为它导入的所有类包含.m,.mm和.c文件,并导入它们等等,以解决 _OBJC_CLASS _ $ _ ClassB“, :错误。我不记得在Xcode 3中不得不做任何这些,但很好,没问题,我把它编译好了。现在,我收到来自类B
的错误s +[B initialize]
。
为什么在没有以任何方式引用的类上调用静态构造函数?我怎样才能解决这个问题,理想情况下不需要改变我的类来进行测试?
更新
为了进一步弄清楚发生了什么,我将所有测试用例和#import "A.h"
注释掉,看看会发生什么。我添加了一个简单的单元测试:
- (void) testSomething {
STAssertTrue(NO, @"did it work?");
}
仍然,我的+[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 <????> ()
答案 0 :(得分:2)
我在xcode 4和我的单元测试套件方面遇到了很多问题。
我必须看到你的消息来源知道你的情况发生了什么,但是OCUnit通过对类的反思来做很多事情。这就是它如何计算出以“test”开头的方法。所以它有一定意义,它正在检查你的类,导致他们的类初始化器被激活。
我知道这可能不是您正在寻找的答案,但如果B的+初始化中的错误是因为它依赖于某种预期的应用程序状态,您可能真的想考虑重构+初始化。由于这个原因,它不应该依赖于类本身以外的任何东西......你无法保证什么时候会发射或状态会是什么状态。
答案 1 :(得分:1)
我使用下面的代码跳过该代码,这首先是我的单元测试所不需要的。我希望这可以帮助其他人,因为它在任何函数中都很有用,而不仅仅是静态初始化器。
+ (void)initialize
{
if (NSClassFromString(@"SenTestSuite")) {
NSLog(@"Not initializing 'B' class, because unit tests are running");
return;
}
...
}