3

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

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

我试图存根这些属性之一,如下所示:

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

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

-[NSProxy doesNotRecognizeSelector:eventGUID] called!

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

谁能为此提供另一种解决方案?

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

4

2 回答 2

3

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

于 2013-06-19T17:23:40.100 回答
2

上面的答案并不让我满意,因为我不喜欢为此创建协议。所以我发现有一种更简单的方法可以做到这一点。代替

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

写吧

[[[self.event stub] andReturn:@"e46e1555-d866-4160-9b42-36d0fb9c29cd"] valueForKey:@"eventGUID"];
于 2013-11-07T08:53:59.773 回答