繁体   English   中英

Xcode 4 单元测试 linker 错误

[英]Xcode 4 unit testing linker error

注意:“使用 GHUnit”不是这个问题的可接受答案。 我知道大多数人认为 GHUnit 比 Xcode4 OCUnit 更好,但这不是我要问的。 我将单独评估。

我有一个在 Xcode4 中从头开始创建的 Xcode 项目,在创建过程中选中了“包括单元测试”复选框。 我还包括了一些我在以前的项目中开发的库。 它们通过“将文件添加到 x...”对话框添加到项目中,并且仅添加到应用程序目标(而不是测试目标)。 它们在运行应用程序时工作正常,所以我认为它们设置正确。 我还为这个项目编写了许多不同的类。

我的测试文件以标准方式设置,名为 [AppName]Tests.h 和.m。
header 的代码:
#import < SenTestingKit/SenTestingKit.h >

@interface [AppName]Tests : SenTestCase {
@private
}
@end

实现代码:
#import "[AppName]Tests.h"

@implementation [AppName]Tests

- (void)setUp
{
    [super setUp];
    // Set-up code here.
}

- (void)tearDown
{
    // Tear-down code here.
    [super tearDown];
}  
// Test methods go here
@end

这只是基本的骨架。 只要我不导入任何其他文件,它在我的其他项目中以及在这个项目中都可以正常工作。 当我从该项目导入另一个文件并使用它时,我在 Xcode output 日志中看到以下错误:
The test bundle at /Users/[Me]/Library/Developer/Xcode/DerivedData/[AppName]-dwuuuwcpmdqxqmgxomoniplwhlpb/Build/Products/Debug-iphonesimulator/[AppName]Tests.octest could not be loaded because a link error occurred. It is likely that dyld cannot locate a framework framework or library that the the test bundle was linked against, possibly because the framework or library had an incorrect install path at link time.

我已经验证过:

  1. 我使用的所有框架都已添加到应用程序和测试目标的“Link Binary with Libraries”中。
  2. 测试目标已配置为正确构建,并且我的所有测试方法都显示在 Edit Scheme...->Test->Tests
  3. 除此之外的所有问题都已解决,并且没有编译器错误。
  4. 这里讨论的所有设置都设置正确,并且与我测试正确的其他项目相同。

关于可能导致这种情况的任何想法?

我必须将单元测试目标上的“测试主机”属性设置为$(BUNDLE_LOADER) 这解决了我的问题!

我做了以下事情:
http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

深入了解Test_Hosts = $(BUNDLE_LOADER)

设置 Test_Hosts 解决了完全相同的问题!

我只是在这个和类似的错误上浪费了几个小时 - 结果我已经重命名了我的主要目标 - 尝试通过重命名相关变量和删除整个 DerivedData 目录来解决这个问题是不成功的。

我最终只是按照此处的步骤设置了一个新的单元测试目标: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

现在一切都很好。

所以 - 如果你有奇怪的、莫名其妙的链接错误,你最好创建一个新的单元测试目标。 只需2分钟。

当我在运行单元测试时遇到 linker 错误时,有两件事可以解决我的问题。 第一个解决方案是将 Test After Build 构建设置设置为 YES 并选择 Product > Build For > Build For Testing 来运行测试。 此解决方案更易于实施。

第二种解决方案是将应用程序的实现文件添加到单元测试目标中。 通过选择 View > Utilities > File Inspector 打开文件检查器。 Select 项目导航器中的一个实现文件。 Select 文件检查器中单元测试目标旁边的复选框。

对于在模拟器中运行的 iPhone 应用程序,请确保 Test Host 构建设置为空白。 模拟器不支持应用程序托管的单元测试。

运行 Xcode 4.5.2 时遇到此错误 - 这是 2012 年 11 月 - 以上均无效。 似乎设置捆绑加载器和测试主机应该为您填写项目中的所有依赖项 - 或者在您的应用程序环境中运行测试或其他东西,但不幸的是对我不起作用。 它所做的是防止特定的 Xcode 警告有关哪些文件/库丢失。

对我有用的是添加一个新目标:cocoa 触摸单元测试,(确保捆绑加载器和测试主机构建设置为空),观察构建错误并手动添加缺少的依赖项 - 一个一个的所有源文件来自我需要的项目,然后是框架。 不是很优雅,但我很高兴让它工作。 不知道为什么我还没有尝试过这个 GHUnit 库。

我曾经遇到过同样的问题。 出于某种原因,我的项目的一个源文件也包含在为测试目标编译时,这会导致此链接错误。

通过确保只编译测试实现文件,您应该能够解决此错误。 您可以在以下位置查看:

TestTarget -> 构建阶段 -> 编译源

我知道这个问题已经很老了,但我只是在同样的问题上挣扎了一段时间,终于设法解决了,所以让我分享一下我的发现。

我一直在将应用程序从 iOS 移植到 Mac,项目本身是为 iOS 创建的,因此项目和主要目标在支持的平台上都有iOS 现在,当我开始移植时,我为 Mac 创建了新目标,并将支持的平台更改为仅针对该目标的 OSX。 之后我为单元测试创建了另一个目标,但忘记将支持的平台从 iOS 更改为 Mac。 我想您应该已经知道问题出在哪里,基本上单元测试目标默认情况下与 Cocoa 框架链接,所以由于该目标支持的平台只有 iOS,因此 Z1ED76D35F95379C2C1B160C2154C5C2 框架从未正确构建并且从未正确链接。 将测试目标的支持平台更改为 OSX 解决了该问题。

我知道这对 iOS 测试目标可能不是很有帮助,但至少 go 到您的测试目标 Link Binary With Libraries 部分,看看是否有任何红色库。 这给了我这个想法,也许它也会帮助你们中的一些人。

最近几次合并后我遇到了这个问题,我和一个同事都向项目中添加了文件,并不是所有的实现文件都是单元测试目标的成员。

解决方案:

  1. Select 一小部分.m文件(使用“在导航器中过滤”(cmd-opt-j)搜索.m
  2. 显示文件检查器 (cmd-opt-1) 以查看文件的目标成员资格
  3. 确保适当的文件是您的测试目标的成员。

注意:如果测试目标复选框显示-而不是+或未选中,则表示部分(但不是全部)选定文件是目标的成员。

我尝试在与.xcodeprojproject.pbxproj文件合并时做更智能的事情,但我每次都因为它的难以理解而放弃了挫败感,并转而使用这种方法。

(另一个说明:我一次只 select 几个文件,原因有两个:

  • Xcode 在选择超过 7-10 个文件时文件检查器的性能很差
  • Some files aren't and shouldn't be a member of the test target, and it's easier to do a process of elimination when the selected range is small)

确保测试目标将应用目标配置为依赖项(构建阶段 -> 目标依赖项)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM