UnitTests的RestKit实体映射不起作用

时间:2013-11-09 07:24:54

标签: unit-testing restkit restkit-0.20

我正在尝试在UnitTest之外创建我的RKEntityMapping。我遇到的问题是,只有在我的测试中创建它才有效。例如,这有效:

RKEntityMapping *accountListMapping = [RKEntityMapping mappingForEntityForName:@"CustomerListResponse"                                                            inManagedObjectStore:_sut.managedObjectStore];
[accountListMapping addAttributeMappingsFromDictionary:@{@"count":  @"pageCount",
                                                         @"page":   @"currentPage",
                                                         @"pages":  @"pages"}];

虽然现在可以使用以下功能。 all to accoutListMapping使用相同的托管对象库返回上面显示的内容:     RKEntityMapping * accountListMapping = [_sut accountListMapping];

RKEntityMapping中创建_sut时出现此错误:

<unknown>:0: error: -[SBAccountTests testAccountListFetch] : 0x9e9cd10: failed with error:
Error Domain=org.restkit.RestKit.ErrorDomain Code=1007 "Cannot perform a mapping operation
with a nil destination object." UserInfo=0x8c64490 {NSLocalizedDescription=Cannot perform
a mapping operation with a nil destination object.}

我假设它所指的nil目标对象是destinationObject:nil

RKMappingTest *maptest = [RKMappingTest testForMapping:accountListMapping
                                          sourceObject:_parsedJSON
                                     destinationObject:nil];

4 个答案:

答案 0 :(得分:3)

确保您创建的文件具有主要目标和测试目标的目标成员资格。你可以通过以下方式找到:

  • 点击班级的.m文件
  • 打开实用工具栏(右侧的工具栏)
  • 目标会员资格部分中的
  • 勾选两个目标。

这是因为如果您的类没有测试目标的目标成员资格,则测试目标实际上会创建您创建的类的副本,这意味着它具有与主目标不同的二进制文件。这导致该类使用RestKit二进制文件的测试版本,而不是主项目RestKit。这将导致isKindOfClass方法在尝试查看您传递的映射是否是来自主项目的RKObjectMapping类型时失败,因为它是来自RestKit的测试项目版本的RKObjectMapping类型,因此您的映射不会被使用,你得到了崩溃。

至少这是我对LLVM编译器如何工作的理解。我是iOS开发人员的新手,所以如果我出错了,请随时纠正。

答案 1 :(得分:1)

当使用Cocoapods时,单独包含多个目标的RestKit组件时,也可能由重复的类定义引起此问题。

有关详细信息,请查看this answer

答案 2 :(得分:0)

当您运行测试时,您没有使用整个映射基础结构,因此RestKit不会为您创建目标对象。它只会测试映射本身。因此,您需要向测试方法提供所有三条信息,否则它将无法正常工作。

答案 3 :(得分:0)

我在Mapped对象上使用了一个类别,例如

RestKitMappings+SomeClass

+ (RKObjectMapping*)responsemappings {
return mappings;
}

现在这个类别必须包含在测试目标中,否则映射将不会被传递。