【问题标题】:_OBJC_CLASS_$ Errors While Unit Testing Custom Classes In iOS 4.2在 iOS 4.2 中对自定义类进行单元测试时出现 _OBJC_CLASS_$ 错误
【发布时间】:2010-12-03 14:13:46
【问题描述】:

好的,我花了大约 5 个小时试图弄清楚这一点。绝对没有一个过去的 Stackoverflow 主题解决方案对我有用,所以我希望有人能给我一个答案,而不是胡思乱想。

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

自定义类是简单的子类 NSObjects,带有微不足道的 iVar。我们将这个类称为“Snookie”。

我已经尝试了几个有问题的解决方案,但希望得到有完全相同问题的人的回应,并给出一个有意义的答案。

复制:

  1. 添加 MyAppTesting 单元测试捆绑目标。
  2. 在获取有关 MyAppTesting 的信息下,将 MyApp 添加为直接依赖项。
  3. 创建一个名为“Tests”的组。
  4. 在“测试”下,添加 ObjectiveC 测试用例类。
  5. 在新的测试用例类 .h 中,导入 Snookie.h,并创建一个 iVar:
#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

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

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

    将MyApp 添加为直接依赖项不足以告诉Xcode 编译/链接来自MyApp 的代码。您需要将Snookie.m 文件显式添加到MyAppTesting 的目标中。

    【讨论】:

    • 在我发布该内容和您的回复期间,我对完全相同的问题采取了不同的方法。查看“应用程序测试”部分下的 Apple 文档developer.apple.com/library/ios/#documentation/Xcode/Conceptual/…。我完全按照步骤,将我的标头导入到测试中,仍然得到相同的结果。
    • 该示例中没有任何地方告诉您如何将您正在测试的类链接到您的测试包。您需要将 Snookie.m 添加到测试包中。这正是错误告诉您的内容。
    • 在放松休息后,Kperry 和 JeremyP 100% 正确。我后续错误的根源是由于糟糕的接口编程,这导致了代码的重构.....谢谢!!!!
    • 这可行,但不是最简单的方法。签出:twobitlabs.com/2011/06/…
    【解决方案2】:

    虽然将应用的 .m 文件直接添加到测试目标可以解决问题,但这是多余且不必要的。按照the steps outlined here by Two Bit Labs 让它工作。总而言之,请确保您的……

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

    【讨论】:

    • 这对我不起作用。在设置我的符号默认隐藏后:不,构建 & 清理 & 构建 & 清理 & 构建,我仍然没有得到我的 .m 链接。
    • 这是完成这项工作的唯一正确方法。所有其他事情都在为项目增加冗余。如果您遵循上面链接中的指南,这是完美的。
    【解决方案3】:

    kperryua 是正确的。

    在 XCode 5 中,单击要测试的类的实现文件(例如 XYZCustomClass.m),确保可以看到实用程序屏幕(如果隐藏,可以在查看 > 实用程序 > 显示实用程序下显示),然后选中 Target Membership 框下的 [your tests name] Tests 复选框。瞧,您的单元测试“OBJC_CLASS_$ . . .”,引用自:objc-class-ref in 。 . ._Tests.o" 错误信息将消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2017-04-07
      • 2018-05-27
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多