iPhone单元测试链接问题,找不到DevToolsBundleInjection.framework

Posted

技术标签:

【中文标题】iPhone单元测试链接问题,找不到DevToolsBundleInjection.framework【英文标题】:iPhone unit test linking problem, can’t find DevToolsBundleInjection.framework 【发布时间】:2010-02-10 07:11:25 【问题描述】:

我正在尝试为我的 iphone 应用程序设置应用程序单元测试。因此,我制作了 app 目标的副本,以及 Apple 的 documentation 中所述的单元测试捆绑目标。

按照 Apple 的指示后,我无法在单元测试中引用我的类,因此我使用“Bundle Loader”构建设置将应用程序链接到单元测试包,并将主要目标设置为导出符号。这解决了编译时间错误,并且在我更改它后它立即工作并执行了我的测试。但是一旦我清理并再次构建,当我尝试在设备上运行时开始出现此错误:

Unable to read symbols for "/Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.1 (7C144)/Symbols/Developer/Library/PrivateFrameworks/DevToolsBundleInjection.framework/DevToolsBundleInjection" (file not found).

文件确实不存在。我在以下位置找到了 .framework 文件: /Xcode3.1.4/Library/PrivateFrameworks PrivateFrameworks

并建立了一个符号链接。然后运行app说不能链接app的文件:

010-01-25 20:19:22.330 SmokeyTheBear[5808:207] Error loading /private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests:  dlopen(/private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests, 262): Symbol not found: _OBJC_CLASS_$_AppDelegate
  Referenced from: /private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests
  Expected in: /var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/UDorse
 in /private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest/LogicTests
DevToolsBundleInjection: Error loading bundle '/private/var/mobile/Applications/26E1F8F4-6444-415B-84CB-BB161DBA29E9/SmokeyTheBear.app/LogicTests.octest'

然后,我切换回运行应用程序的正常目标,它运行了我所有的单元测试并退出了!我再次清理并构建,然后正常目标正常运行。单元测试目标仍然不起作用。

【问题讨论】:

您能提供反馈吗? 【参考方案1】:

根据给出的日志消息,我假设您正在尝试设置“逻辑测试” (尴尬,不是吗?)。您的问题是,当需要将其包含在测试包中时,您尝试链接到要测试的代码。这是manual 的相关部分(重点是我的)。

为一个测试用例访问主题 API,您可能需要添加 适当的实施文件 单元测试包并导入 相应的头文件到你的 单元测试类。举个例子 使用单元测试的项目,请参阅 iPhoneUnitTests 示例代码项目。

我发现使用 OCUnit 进行单元测试设置也不是最佳体验。单元测试在 Obj-C 世界中根本不是一流的实践,至少从 Apple 提供的东西来看是这样。 OCTest 是 SenTestingKit 的定制版本。基本上,它创建了一个扩展名为 .octest 的库,OCTest 运行程序 (otest) 执行该库。 iPhone 不支持动态链接(更好的说法是:允许),所以这就是为什么你只能在你的 mac 上运行测试。

这是“逻辑测试”的简单案例,“应用程序测试”稍微复杂一些。 OCUnit 的工作方式会带来各种痛苦,尤其是在调试方面。 这就是我和许多其他人选择退出 OCTest 并选择 GTM 或 GHUnit 的原因。它们通过静态链接工作,并将测试运行器包含在测试目标本身中。 (有点类似于“应用程序测试”。)

【讨论】:

哦,顺便说一句,如果还有什么不清楚的地方,你真的应该检查一下示例项目。【参考方案2】:

虽然这不能直接回答您的问题,但我想说我尝试使用 Apple 的单元测试信息遵循您的路线,发现它不是最佳的 TDD 方法,所以我选择使用其他人推荐的方法:

Google's Toolbox iPhoneUnitTesting Kit

UISpec for GUI unit testing

Tutorial 关于如何运行它以及关于 iPhone 单元测试可用的不同选项的讨论。

我认为苹果提供的选项只能在模拟器模式下运行,并且有许多其他缺点......很抱歉没有直接回答您的问题,但也许您可以从不同的角度解决问题(就像我发布给您的那些这里 )。

【讨论】:

以上是关于iPhone单元测试链接问题,找不到DevToolsBundleInjection.framework的主要内容,如果未能解决你的问题,请参考以下文章

无法在 iphone 单元测试中从 NSBundle 加载文件

单元测试找不到要测试的类

.dylib 在 Debug 中链接,在 XCode 中找不到 iPhone 的 Release

Python单元测试找不到模块[重复]

为啥 Xcode 找不到我的单元测试应用程序?

iPhone 上的 ocunit 测试