用于单元测试的GH-Unit Objective-C代码,为什么我会收到链接错误?

时间:2010-04-09 20:25:58

标签: 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];
    GHAssertNotNil(s,@"Was nil.");      
}

@end

然而,当我尝试构建并运行我的测试时,它会因此错误而呻吟: -

  

未定义的符号:

     

“_ OBJC_CLASS _ $ _ Show”,引自:

 __objc_classrefs__DATA@0 in ShowTest.o
     

ld:找不到符号

     

collect2:ld返回1退出状态

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

http://github.com/gabriel/gh-unit/blob/master/README.md

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

  

在目标'测试'信息窗口中,常规标签:

     

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

     

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

     

添加直接相关性,然后选择您的项目。 (这将导致您的应用程序或框架在测试目标之前构建。)

如果我的项目全部接受它.dylib,.framework和.o文件,我应该如何将我的项目添加到链接库列表?

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:0)

@implementation必须有Show

或者你可以使用

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

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

在运行时解析类。

答案 2 :(得分:0)

不知何故,Apple的示例无需复制目标中的.m文件即可运行。

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

http://developer.apple.com/IPhone/library/samplecode/iPhoneUnitTests/Introduction/Intro.html

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

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

使这项工作变得神奇的是什么?