4

问题

在我们的许多单元测试中,我们使用 OCMock 模拟对象。作为我们测试代码如何响应服务器响应的一部分,我们创建了一个 NSURLSessionDataTask 对象,然后尝试在其上使用“response”属性。

情节变厚了

在 iOS 9 之前,测试运行良好。该属性在 iOS 9 上应用的正常回调流程中也能正常工作。

然而,在 iOS 9 测试版中,测试在运行时崩溃,并出现“无法识别的选择器发送到实例”错误。该属性存在于框架标头中,并且未在文档中标记为已删除。

此示例代码说明了该问题:

NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];

NSLog(@"%@", task.response);

一种理论

似乎类的直接实例化不再在运行时提供属性。该属性似乎@dynamic是在运行时使用不同的实例化路径生成的属性。

问题

如何在单元测试 OCMock 对象中以与在 iOS 8 上运行单元测试向后兼容的方式解决此问题?

更新 1

将 OCMock 更新到最新版本 (3.1.5) 并不能解决问题。

对于其他上下文,这是我们如何使用NSURLSessionDataTaskOCMock。测试在第三行失败。

NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
OCMockObject *mockTask = [OCMockObject partialMockForObject:task];
[[[mockTask stub] andReturn:urlResponse] response];
4

1 回答 1

2

OCMock 3.2 现在可用,它解决了这个问题。

修复是“添加模拟动态属性的能力和测试”

于 2015-10-09T15:14:43.507 回答