1

我正在尝试遵循 RestKit 单元测试指南(https://github.com/RestKit/RestKit/wiki/Unit-Testing-with-RestKit),但我的项目是静态库而不是应用程序。

这是我写的测试:

- (void)testMappingOfDate
{
    id parsedJSON = [RKTestFixture parsedObjectWithContentsOfFixture:@"plan.json"];
    RKMappingTest *test = [RKMappingTest testForMapping:[self planMapping] object:parsedJSON];
    [test expectMappingFromKeyPath:@"plan.date" toKeyPath:@"date"];
    STAssertNoThrow([test verify], nil);
}

当我尝试运行测试时,我在测试的第一行收到此错误:

error: testMappingOfDate (api_clientTests) failed: -[NSBundle parsedObjectWithContentsOfResource:withExtension:]: unrecognized selector sent to instance 0x1765c40

似乎它没有找到由 RestKit 定义的 NSBundle 类别,但是我的测试目标标头搜索路径设置为,"$(BUILT_PRODUCTS_DIR)/../../Headers"并且我已经验证了该路径包括NSBundle+RKAdditions.h其中包含假定的“无法识别的选择器”。

我在这里缺少什么吗?

4

2 回答 2

2

您正在尝试在来自库的二进制文件中包含一个类别。为了实现这一点,您需要将以下内容添加到您的(单元测试目标的)构建设置中。

其他链接器标志:-ObjC

在此处输入图像描述

来自 Apple 的 QA

Objective-C 没有为每个函数(或 Objective-C 中的方法)定义链接器符号 - 相反,链接器符号只为每个类生成。如果您使用类别扩展预先存在的类,则链接器不知道将核心类实现的目标代码与类别实现相关联。这可以防止在生成的应用程序中创建的对象响应类别中定义的选择器。

解决方案:

要解决此问题,静态库应将 -ObjC 选项传递给链接器。此标志使链接器加载定义了 Objective-C 类或类别的库中的每个目标文件。虽然此选项通常会导致更大的可执行文件(由于加载到应用程序中的附加目标代码),但它将允许成功创建包含现有类的类别的有效 Objective-C 静态库。

于 2012-07-22T20:33:58.547 回答
1

该错误意味着“无法识别的选择器”问题在运行时。编译器和 NSBundle+RKAdditions.h 在编译 timr 时不会给出这个错误。

问题是该代码@implementation NSBundle(RKAdditions)未链接到您的应用程序中。所以你需要把它添加到你的构建中

于 2012-07-22T20:16:57.990 回答