我正在尝试按照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
,其中包含假设的“无法识别”选择器”。
这里有什么我想念的吗?
答案 0 :(得分:2)
您正尝试在二进制文件中包含来自库的类别。要完成这项工作,您需要将以下内容添加到(Unit-Test-Target)构建设置中。
其他链接标志:-ObjC
Objective-C没有为每个函数定义链接器符号(或 在Objective-C)中的方法 - 而是仅生成链接符号 为每个班级。如果使用类别扩展预先存在的类, 链接器不知道关联核心的目标代码 类实现和类实现。这可以防止 生成的应用程序中创建的对象响应a 在类别中定义的选择器。
解决方案:
要解决此问题,静态库应传递-ObjC选项 到链接器。此标志使链接器加载每个目标文件 在库中定义Objective-C类或类别。而 此选项通常会产生更大的可执行文件(由于 额外的对象代码加载到应用程序中),它将允许 成功创建了有效的Objective-C静态库 包含现有类的类别。
答案 1 :(得分:1)
错误意味着“无法识别的选择器”问题在运行时。编译器和NSBundle + RKAdditions.h不会在编译时给出这个错误。
问题是@implementation NSBundle(RKAdditions)
的代码未链接到您的应用中。所以你需要将它添加到你的构建