【发布时间】:2012-10-11 22:23:02
【问题描述】:
虽然我在 SO 中看到过类似的问题,但似乎没有一个答案能解决我的问题。
我有一个由 mogenerator 生成的带有自定义函数的 NSManagedObject 类(不在模型中):
@interface MyManagedClass : _MyManagedClass {
-(NSNumber*)getRandomNumber2;
-(void)function_I_want_to_test;
}
我的 function_I_want_to_test() 取决于 random() 的结果,这是我在测试期间必须控制的。由于我无法模拟 random(),所以我构建了一个函数包装器,顺便说一下,它不是静态的,因为 OCMock 和静态类函数有很多问题。
我的单元测试设置如下:
[MagicalRecord setDefaultModelFromClass:[self class]];
[MagicalRecord setupCoreDataStackWithInMemoryStore];
使用调试器,我可以验证模型是否已正确加载。另外,如果我以非 magical 方式进行操作:
NSBundle *b = [NSBundle bundleForClass:[self class]];
model = [NSManagedObjectModel mergedModelFromBundles:@[b]];
在这一点之后,我无法创建任何模拟来存根我的 random() 包装函数
我试过模拟类
id mock = [OCMockObject mockForClass:[MyManagedClass class]];
[[[mock stub] andReturn:@50] getRandomNumber2];
MyManagedClass *my_object = [mock MR_createEntity];
我尝试过使用部分模拟
MyManagedClass *my_object = [MyManagedClass MR_createEntity];
id mock2 = [OCMockObject partialMockForObject:my_object];
在最后一点之后,仅仅创建一个mock2的实例就破坏了my_object的动态属性,它变得无用了。
我也尝试过使用模拟协议和我想要存根的函数,但仍然无济于事。
运行时异常是其他人在对 Core Data 对象进行测试时遇到的正常情况:属性不是可识别的选择器。
但对我来说奇怪的是,我并没有尝试存根任何动态属性,而是一个正常的、编译时已知的函数。因此,我觉得使用 OCMock 会使我的实例毫无用处似乎很奇怪。
理想情况下,我想要使用 OCMock/Mogenerator/Magicalrecord 的东西。
我做错了什么?
【问题讨论】:
标签: objective-c core-data tdd ocmock magicalrecord