GH单元用于单元测试Objective-C代码,为什么会出现链接错误?

GH单元用于单元测试Objective-C代码,为什么会出现链接错误?,objective-c,unit-testing,xcode,linker,gh-unit,Objective C,Unit Testing,Xcode,Linker,Gh Unit,我正试图深入到使用Xcode进行单元测试的非常糟糕的世界中(这似乎是一个复杂的过程) 基本上我有这个测试类,试图测试我的Show.h类 #import <GHUnit/GHUnit.h> #import "Show.h" @interface ShowTest : GHTestCase { } @end @implementation ShowTest - (void)testShowCreate { Show *s = [[Show alloc] init]; G

我正试图深入到使用Xcode进行单元测试的非常糟糕的世界中(这似乎是一个复杂的过程)

基本上我有这个测试类,试图测试我的Show.h类

#import <GHUnit/GHUnit.h>
#import "Show.h"
@interface ShowTest : GHTestCase { }
@end

@implementation ShowTest
- (void)testShowCreate
{
    Show *s = [[Show alloc] init];
    GHAssertNotNil(s,@"Was nil.");      
}

@end
ld:找不到符号

collect2:ld返回了1个退出状态

现在我认为这是一个链接错误。我尝试按照此处说明中的每一步进行操作:-

这些说明的第2步让我很困惑:-

在目标“测试”信息窗口中,常规选项卡:

添加链接库,在Mac OS X 10.5 SDK部分下,选择GHUnit.framework

添加链接库,选择您的项目。

添加直接依赖项,然后选择您的项目。(这将导致您的应用程序或框架在测试目标之前生成。)


当所有项目都接受.dylib、.framework和.o文件时,我应该如何将项目添加到链接库列表中?

对于
Show
,您必须有
@实现

或者你可以用

Show* s = [[objc_getClass("Show") alloc] init];
...


在运行时解析类。

如果要测试的目标是应用程序,则需要在主目标和测试目标中手动包含Show.h/m文件

我还更新了自述以反映这一点:

  • 如果主要目标是库:添加链接库,然后选择主要目标;这样,您就可以将测试目标与主目标链接起来,而不必在两个目标中手动包含源文件
  • 如果您的主要目标是应用程序,则需要手动将这些源文件包括在
    测试项目中
    

抱歉搞混了!必须在两个目标中都包含文件并不理想。

不知何故,苹果的示例在不复制目标中的.m文件的情况下工作

在此处下载苹果的单元测试示例代码(iPhoneUnitTests.zip):

单击CalcTests目标。此目标中只有CalcTests.m

建立目标。它为CalCapDelegate或其他类构建时没有任何链接错误


是什么魔力使这项工作成功?

谢谢你的回答。但这真的是做事的方式吗?我忍不住觉得这是一个解决方案,而不是一个实际的修复方案……另外值得注意的是,Show是我试图测试的项目中的一个类。测试内容位于单独的目标中,直接依赖于我的project@djh:链接器显然找不到Show类。确保您已将Show.m文件包含在测试目标中。感谢KennyTM,这就是我所做的,现在它正在工作:'}以下是为什么苹果的iPhoneUnitTests示例链接。。。他们小心地避免这样的事情:Calculator*Calculator=[[Calculator alloc]init]。相反,它们只执行以下操作:CalCapDelegate*delegate=[[UIApplication sharedApplication]delegate];不幸的是,这种方式受到了限制,如果你需要解决这个问题,你必须按照KennyTM的建议去做。也许我对objective-c环境中的单元测试到底是什么感到困惑?在工作中,我使用JUnit进行Java开发,因此在需要直接测试类的TDD和单元测试方面有很好的经验。无论如何,感谢您的回复:'}非常感谢您的快速回复Gabe(以及自述文件中的澄清!)它现在似乎正在工作。Gabe,没有其他方法吗?例如,向两个目标添加源有点混乱,每次添加新的源文件时,我们都必须记住这一点,我不是在抱怨,只是好奇:)
Show* s = [[objc_getClass("Show") alloc] init];
...
Show* s = [[NSClassFromString(@"Show") alloc] init];
...