我第一次尝试在我的测试用例中使用 OCMock。这是一个 Mac 项目,在 Xcode 4.3 中构建并以 Lion 为目标。主应用程序和测试包都打开了 ARC,因此每次执行测试时,我都会看到以下日志消息:
GC: forcing GC OFF because OBJC_DISABLE_GC is set
没关系,因为我使用的是 ARC,所以我不关心 GC。当我构建我的单元测试时,链接到 OCMock 的最新稳定版本(2.0.1),构建没有问题。在运行时,在上述日志语句之后,我得到以下信息:
The test bundle at /Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest could not be loaded because its Objective-C runtime information does not match the runtime information required by the test rig. This is likely because the test rig is being run with Objective-C garbage collection disabled, but the test bundle requires Objective-C garbage collection. To enable Objective-C garbage collection for the test rig, run it in an environment without the OBJC_DISABLE_GC environment variable.
2012-03-06 10:29:32.812 otest[8486:203] *** NSTask: Task create for path '/Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest/Contents/MacOS/___Tests' failed: 22, "Invalid argument". Terminating temporary process.
该消息暗示垃圾收集是最常见的罪魁祸首,但如前所述,我无法使用 GC。那么,还有哪些其他设置可能会在运行时搞砸我呢?我不认为我在做任何非典型的事情,我已经查看了我的测试项目的设置以确保,并没有看到任何奇怪的东西。
更新
我能够用一个新的空项目重现这一点。
- 创建一个新项目并让它创建单元测试,启用 ARC
- 从单元测试包的构建设置中清除
Test Host
设置 - 链接到 OCMock 框架
- 执行测试,并见证我上面报告的相同错误
另外,当我关闭 ARC 并进行垃圾收集时,会报告machclang
-o 链接器错误,因此构建不会成功。如果我删除到 OCMock 框架的链接,它就可以正常构建。这支持了我最初的想法,即问题出在垃圾收集以外的地方。