2011-06-07 90 views
18

注意:“使用GHUnit”不是此问题的可接受答案。我知道大多数人认为GHUnit比Xcode4 OCUnit更好,但这不是我所问的。我会分开评估。Xcode 4单元测试链接器错误

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

我的测试文件是以标准方式设置的,名为[AppName] Tests.h和.m。
代码头:
#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输出日志以下错误:
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. 我所用有框架被 添加到“链接二进制与 库”为应用程序和测试 目标。
  2. 测试目标已经配置 正确地创建和我所有的 测试方法编辑显示 计划...->测试 - >测试
  3. 每一个问题,但这个已经 解决,有没有编译器 错误。
  4. 所有设置讨论 here 设置是否正确和一致 我认为正确的测试 其他项目。

有什么想法可能会导致这种情况?

+1

我有这个EXACT相同的问题。测试运行正常,直到您从主机应用程序分配一个对象。整天被难住:( – Sam 2011-07-28 16:42:21

+0

@Sam我被困了一个半月:P 最终我放弃了,并测试了老式的方式。也许新的Xcode会修复它,谁知道。 – Kongress 2011-07-28 19:59:40

+0

与我之前的许多人一样,我已经放弃了,现在正在使用GHUnit,花费了大约10分钟的时间来设置 – Sam 2011-07-29 10:27:53

回答

4

当我得到运行单元测试的链接器错误时,有两件事情为我解决了这个问题。第一种解决方案是将Build After Build构建设置设置为YES,然后选择Product> Build For> Build For Testing以运行测试。这个解决方案更容易实现。

第二种解决方案是将应用程序的实现文件添加到单元测试目标。选择“视图”>“实用程序”>“文件检查器”打开文件检查器。在项目导航器中选择一个实现文件。选中文件检查器中单元测试目标旁边的复选框。

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

+0

感谢您的建议,但不幸的是,这些技术都没有解决问题。最终结果与之前的链接器错误一样 我想可能是考虑替代方案的时候了...... – Kongress 2011-06-08 12:52:41

+0

@Kongress ......如果这个答案没有用,那你为什么接受它呢?找到一个解决方案? – PengOne 2011-06-20 05:02:08

+0

@PengOne这个问题已经坐了几个星期了,这是我得到的唯一回应,尽管它没有解决我的具体问题,它是彻底的和有益的。从SO常见问题解答中:“当你决定哪个答案对你最有帮助时,将其标记为已接受的答案......”关于等待这个问题需要多长时间没有明确的指导方针,所以我采取了主动。如果我处理了这个错误,请让我知道以备将来参考。 – Kongress 2011-06-21 13:10:27

0

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

+0

检查。依赖关系似乎配置正确。 – Kongress 2011-06-22 19:04:21

1

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

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

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

+0

优秀的答案。这解决了编译单元测试包时遇到的一个问题。 – 2012-06-30 19:26:57

+0

我不得不采取恰恰相反的方向:只有在将项目中的所有源文件添加到测试目标后,链接器错误才会消失。从目标中删除任何源文件会使链接器错误重新出现。 – 2012-09-13 18:45:14

7

我只是浪费就这个问题和类似的错误小时 - 原来我已经改名为我的主要目标 - 试图通过重命名相关解决这个问题变量以及删除整个DerivedData目录都不成功。

我最终只是建立了一个新的单元测试目标追随这里的步骤: http://twobitlabs.com/2011/06/adding-ocunit-to-an-existing-ios-project-with-xcode-4/

而现在一切都很好。

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

+0

如果我再次回到那个项目/平台,我将不得不尝试一下。 – Kongress 2012-03-06 20:29:20

+0

谢谢!我浪费了几个小时,最终这个简单的解决方案为我工作。 – 2015-08-24 23:16:04

0

我知道这个问题是相当古老的,但我只是在相同的问题上奋斗了一段时间,最终设法解决它,所以让我分享我发现的东西。

我一直在将应用程序从iOS移植到Mac,项目本身是为iOS创建的,因此项目和主目标在支持的平台上都有iOS。现在,当我开始移植时,我为Mac创建了新的目标,并将支持的平台更改为仅针对该目标的OSX。之后,我为单元测试创​​建了另一个目标,但忘了将支持的平台从iOS更改为Mac。我认为你已经应该知道问题是什么,基本上单元测试的目标是默认与Cocoa框架相连,因为这个目标的支持平台只有iOS,可可框架从来没有建立过,没有正确的链接。将受支持的平台更改为测试目标的OSX可解决该问题。

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

13

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

+0

我*没有*有这个设置,并且设置它似乎是这样做的。它在iOS模拟器中启动应用程序,而它运行测试,这似乎很奇怪......但现在我的测试实际运行。 – 2012-09-18 15:52:44

7

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

Test_Hosts = $(BUNDLE_LOADER)

设置完全相同固定同一问题的Test_Hosts采取从深层次看!

+0

优秀的链接。真正有价值的信息。 – Andrew 2013-01-03 21:25:42

+0

我的TEST_HOSTS路径的双引号失败,我的TEST_HOSTS路径周围的单引号失败,NO引号无效。顺便说一下,我的系统中没有空间。 – 2013-05-13 09:06:55

+1

读这篇文章解决了我的问题。构建设置选项卡应该将Bundle Loader设置设置为您的应用程序名称: '$(BUILT_PRODUCTS_DIR)/ MyExistingApp.app/MyExistingApp' – 2013-10-04 22:50:09

1

遇到此错误运行Xcode 4.5.2 - 这是2012年11月 - 以上都无法工作。似乎设置bundle loader和测试主机应该为你的项目填充所有的依赖关系 - 或者在应用程序的环境中运行测试,但不幸的是,它不适合我。它所做的是防止关于哪些文件/库丢失的特定Xcode警告。

对我来说,增加了一个新目标:cocoa touch unit test(确保bundle loader和test host build设置为空),观察构建错误并手动添加缺失的依赖关系 - 一个接一个我的项目中需要的源文件,然后是框架。不是很优雅,但我很乐意让它工作。不知道为什么我还没有尝试过这个GHUnit库。

0

最近几次合并后,我遇到了这种情况,我和同事都将文件添加到项目中,而不是所有的实现文件都是单元测试目标的成员。

解决办法:

  1. 选择一个小范围的.m文件(使用 “在导航器”(CMD-OPT-J)搜索.m
  2. 显示文件检查器(CMD-OPT -1)查看文件的目标成员资格
  3. 确保相应的文件是测试目标的成员。

注:如果测试目标复选框显示-代替+或做选择,这意味着一些,但不是全部,所选文件是目标中的一员。

我试过在合并时与.xcodeprojproject.pbxproj文件做了更多的智能事情,但是我每次都因为它的不可思议性而沮丧,并放弃了这种方法。

(另注:我只有一次选择几个文件,原因有二:

  • 选择超过7-10文件时,Xcode的该文件检查器性能差
  • 某些文件麦凯纳t并且不应该是测试目标的成员,并且当选择的范围很小时更容易进行消除的过程)