【问题标题】:How can I use OCMock objects with code that calls isKindOfClass?如何将 OCMock 对象与调用 isKindOfClass 的代码一起使用?
【发布时间】:2010-10-04 03:49:23
【问题描述】:

我想用 OCMock 测试一些代码。

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

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

但是,当我提供这样创建的基于 OCMockObject 的模拟时:

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

它似乎没有通过isKindOfClass 测试。

有什么建议吗?

【问题讨论】:

  • 这个问题已经过去了很多时间,它仍然是相关的。我不同意你不应该使用 isKindOfClass 而只检查协议的答案。它强制执行“鸭子类型”而不是纯多态性,这应该是一种可接受的风格。我希望 OCMock 能够通过 isKindOfClass 测试...

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


【解决方案1】:

一般规则是,如果您调用 isKindOfClass: 并且您没有传递 plist 类之一(例如,NSString 或 NSNumber),那么您做错了。

如果该方法根据其参数是哪个类执行两个或多个不同的操作,则将其拆分为多个方法,并分别测试每个方法。

如果方法只做一件事,但必须根据对象的类别以不同的方式与对象交互,那么:

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

【讨论】:

  • 建议列表看起来不错,但我不同意使用 isKindofClass 应该只参加基础课程是不对的。例如,在遍历通过 nib 加载的数组并查找您创建的 UITableViewCell 时,它非常有用......
  • 从单元格中测试你需要的东西,而不是它在类层次结构中的位置不是更好吗? (我不知道 Cocoa Touch,所以我无法更具体。)
【解决方案2】:

怎么样:

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

【讨论】:

  • 您能解释一下以使其易于理解吗?
  • 这段代码,用英文说:“每当这个对象(模拟)被发送消息是带有参数[FancyClass class]的isKindOfClass,就返回YES”。换句话说,欺骗所有自称是 FancyClass 实例的人。
  • 您可以使用 [mock stub] 让对象从任何有助于创建测试场景的方法中返回特定的东西,并将已执行的代码与某些依赖项隔离开来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2017-06-07
  • 2015-09-27
相关资源
最近更新 更多