如何将OCMock对象与调用isKindOfClass的代码一起使用?

时间:2009-01-29 01:17:16

标签: ios objective-c iphone cocoa cocoa-touch

我想用OCMock测试一些代码。

代码的内部在我提供给代码的模拟对象上调用[NSObject isKindOfClass],如下所示:

if ([object isKindOfClass:[FancyClass class]]) { ...}

但是,当我提供如下所示的基于OCMockObject的模拟时:

mock = [OCMockObject mockForClass:[FancyClass class]];

它似乎没有通过isKindOfClass测试。

有什么建议吗?

2 个答案:

答案 0 :(得分:8)

一般规则是,如果你正在调用isKindOfClass:并且你没有通过其中一个plist类(例如,NSString或NSNumber),那么你就是在做错了。

如果该方法根据其参数所在的类执行两个或更多不同的操作,请将其复制到多个方法中,并分别测试每个方法。

如果该方法只做一件事,但必须根据对象的不同而与对象进行不同的交互,那么:

  1. 制定协议。 (Obj-C中的协议在某些其他OO语言中称为“接口”,例如Java。)
  2. 使许多类都符合协议。如有必要,请使用类别从外部添加必要的方法。
  3. 使被测方法检查是否符合协议,代替当前的isKindOfClass:检查。
  4. 使被测试的方法使用协议中的方法。

答案 1 :(得分:2)

怎么样:

    [[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL) {YES})] isKindOfClass:[FancyClass class]];