OCMock:存根@dynamic属性

时间:2013-06-19 11:34:31

标签: objective-c core-data ocmock

我正在尝试将单元测试添加到现有的iOS应用程序中,使用其他OCMock

在这个应用程序中,我们有一堆CoreData实体和生成的类。这些类显然包含@dynamic属性。

我尝试将其中一个属性存根如下:

self.event = [OCMockObject mockForClass:[ACEvent class]];
[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] eventGUID];

关键是,它不起作用。显然,因为@dynamic属性默认情况下没有实现,并且在这种情况下依赖于CoreData来提供它。我最终得到了一个N​​SError:

-[NSProxy doesNotRecognizeSelector:eventGUID] called!

我已经看到其他问题,通过在协议(OCMock with Core Data dynamic properties problem)后面抽象CoreData实体来解决这个问题。但由于这是一个现有的代码库,我没有这个选项,因为我无法重构所有内容。

任何人都可以为此提供另一种解决方案吗?

编辑: 作为旁注,我刚刚找到了一个解决方案,但我担心它无法在所有情况下都能正常工作。 我所做的是为测试目标中的这些方法提供一个示例,空实现。它可以工作,但我担心它可能会破坏依赖CoreData工作的其他测试。对此有何见解?

2 个答案:

答案 0 :(得分:3)

使用OCMock我总是为每个托管对象创建一个协议,然后为这些协议创建模拟,但正如你所说,你不能这样做,所以我建议创建一个假代码,它具有你在代码中使用的相同属性你想测试(对于每个NSManagedObject),然后在传递那些假对象时使用强制转换(要么使用OCMock并存根你想要的方法,要么只是创建假类的对象并设置属性你要)。

答案 1 :(得分:2)

上述答案并不能让我满意,因为我不喜欢为此制定协议。所以我发现有一种更简单的方法可以做到这一点。而不是

[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] eventGUID];

只需写下

[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] valueForKey:@"eventGUID"];