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

时间:2010-02-10 07:11:25

标签: iphone objective-c cocoa-touch unit-testing

我正在尝试为我的iphone应用设置应用程序单元测试。所以我制作了应用目标的副本,以及苹果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

并建立了一个符号链接。然后运行应用程序说它无法链接应用程序的文件:

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'

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

2 个答案:

答案 0 :(得分:2)

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

  

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

我发现使用OCUnit的单元测试设置也是次优的体验。单元测试根本不是Obj-C世界的一流实践,至少从Apple提供的内容来看。 OCTest是SenTestingKit的定制版本。基本上它创建了一个扩展名为.octest的库,OCTest runner(otest)执行该库。 iPhone上不支持动态链接(更好的措辞:允许),因此您只能在Mac上运行测试。

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

答案 1 :(得分:0)

虽然这不能直接回答您的问题,但我想说我尝试使用Apple的单元测试信息跟踪您的路线并发现它是一种非最佳TDD方法,所以我选择使用其他人推荐的方式:< / p>

Google's Toolbox iPhoneUnitTesting Kit

UISpec for GUI unit testing

Tutorial关于如何让这种方式运行,以及对iPhone单元测试可用的不同选项的讨论。

我认为苹果提供的选项只能在模拟器模式下运行,还有许多其他缺点...对不直接回答你的问题,但也许你可以用不同的视角解决问题(比如我发布给你的那些)这里 )。