在iOS 4.2中单元测试自定义类时出现_OBJC_CLASS_ $错误

时间:2010-12-03 14:13:46

标签: iphone objective-c

好吧,我花了大约5个小时试图解决这个问题。绝对没有过去的Stackoverflow主题解决方案对我有用,所以我希望有人可以给我一个答案,而不是一个疯狂的追逐。

问题:我有一个x-code项目,需要对我的自定义类进行单元测试。我在iOS SDK 4.2中使用X-Code 3.2.5。遵循几种不同的方法后,我无法对自定义类进行单元测试。使用Apple的例子可以正常工作。

自定义类是具有普通iVars的简单子类NSObject。我们称之为“Snookie”。

我已经尝试了几个可疑的解决方案,但是希望得到一个有完全相同问题的人的答复,答案是有道理的。

复制:

  1. 添加MyAppTesting单元测试包目标。
  2. 在MyAppTesting上获取信息,将MyApp添加为直接依赖。
  3. 创建一个名为“测试”的小组。
  4. 在“测试”下,添加ObjectiveC测试用例类。
  5. 在新的测试用例类.h中,导入Snookie.h,并创建一个iVar:
  6. #import <SenTestingKit/SenTestingKit.h>
    #import <UIKit/UIKit.h>
    
    #import "Snookie.h"
    
    @interface SnookieTests : SenTestCase {
      Snookie *snookieObject;
    }
    @end
    

    在新的测试用例类.m中,alloc / init snookie如下:

    #import "SnookieTests.h"
    
    
    @implementation SnookieTests
    
    - (void) setUp
    {
      snookieObject = [[Snookie alloc] init];
    }
    
    - (void) tearDown
    {
      [snookieObject release];
    }
    
    @end
    

    错误:

    "_OBJC_CLASS_$_Snookie", referenced from:
    Objc-class-ref-to-Snookie in SnookieTests.o
    Symbol(s) not found
    Collect2: Id returned 1 exit status
    

3 个答案:

答案 0 :(得分:4)

链接器试图告诉您的是,它无法在@implementation或其链接的任何框架/库中找到Snookie类的MyAppTesting

添加MyApp作为直接依赖是不足以告诉Xcode编译/链接MyApp的代码。您需要将Snookie.m文件明确添加到目标MyAppTesting

答案 1 :(得分:4)

将应用程序的.m文件直接添加到测试目标时,可以解决问题,但这是多余的,不必要的。关注the steps outlined here by Two Bit Labs以使其正常运行。总结一下,确保你的......

  1. 测试目标Bundle Loader构建设置指向您应用的捆绑包。
  2. 测试目标Test Host构建设置指向您应用的捆绑包。
  3. 应用目标的 Symbols Hidden by Default构建设置为NO

答案 2 :(得分:0)

kperryua是对的。

在XCode 5中,单击您要测试的类实现文件(例如XYZCustomClass.m),确保您可以看到Utilities屏幕(可以在View&gt; Utilities&gt; Show Utilities下显示,如果隐藏),然后选中目标成员资格框下的[您的测试名称]测试复选框。瞧,你的单位测试“OBJC_CLASS_ $ ...”,引自:objc-class-ref in。 。 ._Tests.o“错误信息将消失。