5

我正试图深入到使用 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 步让我感到困惑:-

在 Target 'Tests' Info 窗口的 General 选项卡中:

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

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

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

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

4

3 回答 3

7

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

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

  • 如果您的主要目标是库:添加链接库,然后选择您的主要目标;这样您就可以将您的测试目标链接到您的主要目标,然后您不必在两个目标中手动包含源文件。
  • If your main target is an application, you will need to include these source files in the Test project manually.

Sorry for the confusion! Having to include files in both targets is not ideal.

于 2010-04-09T23:30:14.100 回答
0

你必须有一个@implementationfor Show

或者你可以使用

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

或者

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

在运行时解决类。

于 2010-04-09T20:29:06.000 回答
0

Somehow Apple's example works without duplicating the .m files in the target.

Download Apple's unit testing sample code (iPhoneUnitTests.zip) here:

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

Click on the CalcTests target. Only CalcTests.m is in this target.

Build the target. It builds without any link errors for CalcAppDelegate or other classes.

What's the magic that makes this work?

于 2010-04-10T02:52:44.850 回答