代码之家  ›  专栏  ›  技术社区  ›  djhworld

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

  •  5
  • djhworld  · 技术社区  · 15 年前

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

    基本上我有这个测试课,尝试测试我的节目。

    #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 回复  |  直到 7 年前
        1
  •  7
  •   Gabriel    15 年前

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

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

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

    不好意思弄混了!在两个目标中都包含文件是不理想的。

        2
  •  0
  •   kennytm    15 年前

    你必须有一个 @implementation 对于 Show .

    或者你可以用

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

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

    在运行时解析类。

        3
  •  0
  •   Brian Hill    15 年前

    不知怎的,苹果的例子在不复制目标中.m文件的情况下工作。

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

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

    单击CalcTests目标。只有calcttests.m在这个目标中。

    建立目标。它不会为CalcAppDelegate或其他类生成任何链接错误。

    什么样的魔法能让这一切成功?