OCMock -[NSURLSessionDataTask 响应] iOS 9 中无法识别的选择器崩溃
OCMock -[NSURLSessionDataTask response] unrecognized selector crash in iOS 9
问题
我们在许多单元测试中使用 OCMock 模拟 objects。作为查看我们的代码如何响应服务器响应的测试的一部分,我们创建了一个 NSURLSessionDataTask object,稍后尝试在其上使用 "response" 属性。
剧情变厚了
iOS9 之前的测试运行就好了。 属性 在 iOS 9.
上应用程序的正常回调流程中也能正常工作
然而,对于 iOS 9 Beta,测试在运行时崩溃并出现 "unrecognized selector sent to instance" 错误。 属性 存在于框架 header 中,未在文档中标记为已删除。
此示例代码说明了问题:
NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
NSLog(@"%@", task.response);
一个理论
似乎 class 的直接实例化不再在运行时给出 属性。 属性 似乎是一个 @dynamic
属性,它是在运行时使用不同的实例化路径生成的。
问题
我如何在单元测试 OCMock objects 中以一种向后兼容 运行 iOS 8 上的单元测试的方式解决这个问题?
更新 1
将 OCMock 更新到最新版本 (3.1.5) 无法解决问题。
对于其他上下文,这里是我们如何将 NSURLSessionDataTask
与 OCMock 一起使用。测试在第三行失败。
NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
OCMockObject *mockTask = [OCMockObject partialMockForObject:task];
[[[mockTask stub] andReturn:urlResponse] response];
OCMock 3.2 现已发布,解决了这个问题。
问题
我们在许多单元测试中使用 OCMock 模拟 objects。作为查看我们的代码如何响应服务器响应的测试的一部分,我们创建了一个 NSURLSessionDataTask object,稍后尝试在其上使用 "response" 属性。
剧情变厚了
iOS9 之前的测试运行就好了。 属性 在 iOS 9.
上应用程序的正常回调流程中也能正常工作然而,对于 iOS 9 Beta,测试在运行时崩溃并出现 "unrecognized selector sent to instance" 错误。 属性 存在于框架 header 中,未在文档中标记为已删除。
此示例代码说明了问题:
NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
NSLog(@"%@", task.response);
一个理论
似乎 class 的直接实例化不再在运行时给出 属性。 属性 似乎是一个 @dynamic
属性,它是在运行时使用不同的实例化路径生成的。
问题
我如何在单元测试 OCMock objects 中以一种向后兼容 运行 iOS 8 上的单元测试的方式解决这个问题?
更新 1
将 OCMock 更新到最新版本 (3.1.5) 无法解决问题。
对于其他上下文,这里是我们如何将 NSURLSessionDataTask
与 OCMock 一起使用。测试在第三行失败。
NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
OCMockObject *mockTask = [OCMockObject partialMockForObject:task];
[[[mockTask stub] andReturn:urlResponse] response];
OCMock 3.2 现已发布,解决了这个问题。