【问题标题】:OCMock Failing at runtimeOCMock 在运行时失败
【发布时间】:2012-03-24 04:05:33
【问题描述】:

我第一次尝试在我的测试用例中使用 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。那么,还有哪些其他设置可能会在运行时搞砸我呢?我不认为我在做任何非典型的事情,并且我已经检查了我的测试项目的设置以确保,并没有看到任何奇怪的东西。

更新

我能够用一个新的空项目重现这一点。

  1. 创建一个新项目并让它创建单元测试,并启用 ARC
  2. 从单元测试包的构建设置中清除 Test Host 设置
  3. 链接到 OCMock 框架
  4. 执行测试,看到我上面报告的相同错误

另外,当我关闭 ARC 并进行垃圾收集必需时,clang 会报告 mach-o 链接器错误,因此构建不会成功。如果我删除到 OCMock 框架的链接,它就可以正常构建。这支持了我最初的想法,即问题出在垃圾收集以外的其他地方。

【问题讨论】:

  • 它说它可能无法正常工作,因为 GC 已关闭。 “测试包需要 Objective-C 垃圾收集”。所以尽量不要设置 OBJC_DISABLE_GC。
  • @vakio “测试包”是我自己的测试代码,它使用 ARC,这就是禁用 GC 的原因。该消息只是对运行时环境中通常错误的提示。我尝试启用 GC,但 LLVM 失败,可能是因为 ARC 和 GC 不能共存。

标签: objective-c cocoa xcode4 osx-lion ocmock


【解决方案1】:

在搜索了我能想到的所有内容之后,我在Hamcrest tutorial 中找到了答案(仔细阅读从OCMock.org 链接的OCMock tutorial,那里也提到了它)。由于某种原因,需要将 Hamcrest 和 OCMock 的框架复制到 products 目录。然后一切都像魅力一样发挥作用。

  1. 转到测试包的设置
  2. 转到构建阶段标签
  3. 单击添加构建阶段按钮,然后选择添加复制文件
  4. 将新的 Copy Files 构建阶段的 Destination 设置为 Products Directory
  5. 将 OCMock.framework 从项目大纲拖到阶段的文件列表中
  6. 将复制文件阶段拖到运行脚本阶段
  7. 上方

照常执行测试

【讨论】:

  • OCHamrest 和 OCMock 都是在加载器路径中使用 @rpath 构建的。这使它们在 products 目录中工作,因为默认情况下它在路径上。你可以使用LC_RPATH等方式给你更多的灵活性。请参阅 dyld 手册页上对 @rpath 的讨论。
  • 我的项目也遇到了同样的问题,其中包括 Growl 框架。解决方法是一样的,谢谢!
  • 哇,这很难追踪。非常感谢您发布此内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
相关资源
最近更新 更多