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

时间:2012-07-22 20:09:11

标签: ios xcode unit-testing restkit sentestingkit

我正在尝试按照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,其中包含假设的“无法识别”选择器”。

这里有什么我想念的吗?

2 个答案:

答案 0 :(得分:2)

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

其他链接标志:-ObjC

enter image description here

From Apple's QA

  

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

解决方案:

  

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

答案 1 :(得分:1)

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

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