2012-07-22 82 views
1

我试图跟随RestKit单元测试指南(https://github.com/RestKit/RestKit/wiki/Unit-Testing-with-RestKit),除了我的项目是一个静态库,而不是一个应用程序。单元测试静态库与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

你正试图在库中包含一个类别的二进制文件。为了实现这一目标,您需要将以下内容添加到您的(Unit-Test-Target's)构建设置中。

其它链接器标记:-ObjC

enter image description here

From Apple's QA

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

解决方案:

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

+0

该链接不存在(我在一个免费的开发者帐户,但我认为这不会影响查找)谷歌似乎给了http://developer.apple。 com/library/mac /#qa/qa1490/_index.html – Mark 2012-07-22 20:38:08

+0

这似乎确实改变了这个问题,现在我得到了一堆错误:'未定义的架构i386符号: “_CFHTTPMessageAddAuthentication”,引用来自: - RKRequest addHeadersToRequest] in libRestKit.a(RKRequest.o) - [RKRequest addHeadersToRequest] in libopentripplanner-api-client.a(RKRequest.o)' – mark 2012-07-22 20:40:46

+0

您还必须链接一堆其他库,以及 - 你需要检查您尝试使用的库的文档。注意“链接的框架”。 – Till 2012-07-22 20:45:53

1

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

问题是@implementation NSBundle(RKAdditions)没有链接到您的应用程序的代码。所以你需要把它添加到你的版本中

+0

我已将'libReskKit.a'添加到我测试的“链接二进制库”中,并且仍然收到相同的错误。 – mark 2012-07-22 20:22:36

+0

@mark - 你的意思是建立你的静态库或单元测试运行? – Mark 2012-07-22 20:24:32

+0

我现在有'libReskKit。在我的静态库和我的单元测试包中的“库中的链接二进制文件”部分中有一个“a”。 – mark 2012-07-22 20:25:41