繁体   English   中英

使用RestKit对静态库进行单元测试

[英]Unit testing a static library with RestKit

我试图跟随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其中包含假定的“无法识别的选择器”。

这里有什么我想念的吗?

您试图在二进制文件中包含来自库的类别。 要完成这项工作,您需要将以下内容添加到(Unit-Test-Target)构建设置中。

其他链接器标志:-ObjC

在此输入图像描述

来自Apple的质量保证

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

解:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM