我正在尝试将单元测试添加到现有的 iOS 应用程序中,其中使用OCMock
.
在此应用程序中,我们有一堆 CoreData 实体和生成的类。这些类显然包含@dynamic
特性。
我尝试按如下方式存根这些属性之一:
self.event = [OCMockObject mockForClass:[ACEvent class]];
[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] eventGUID];
重点是,它不起作用。显然是因为一个@dynamic
property 默认情况下没有实现,在这种情况下依赖 CoreData 来提供它。我最终得到了一个 NSError:
-[NSProxy doesNotRecognizeSelector:eventGUID] called!
我见过其他问题,通过抽象协议背后的 CoreData 实体来解决这个问题(OCMock 与 Core Data 动态属性问题 https://stackoverflow.com/questions/1876568/ocmock-with-core-data-dynamic-properties-problem)。但由于这是现有的代码库,我没有这个选项,因为我无力重构所有内容。
任何人都可以提供另一种解决方案吗?
编辑:
顺便说一句,我刚刚找到了一个解决方案,但我担心它不能在所有情况下都有效。
我所做的是为测试目标中的这些方法提供一个示例、空实现。它有效,但我担心它可能会破坏依赖 CoreData 工作的其他测试。对此有何见解?
使用 OCMock,我总是为每个托管对象创建一个协议,然后为这些协议创建模拟,但正如您所说,您不能这样做,所以我建议创建一个假类,其属性与您想要的代码中使用的属性相同测试(对于每个NSManagedObject
),然后在传递这些假对象时使用强制转换(要么使用 OCMock 并存根您想要的方法,要么只是创建假类的对象并设置您想要的属性)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)