目标C& OC Mock - 模拟一个类方法?

我需要能够确定是否调用了类方法。 我怎么能用OCMock做到这一点?     
已邀请:
从OCMock版本2.1开始,这支持开箱即用。您现在可以使用与存根实例方法相同的方式存根类方法。     
一种方法是将类方法包装在您自己的类中的方法中。所以,假设你的班级必须打电话给
[SomeOtherClass classMethod:someString]
。您可以在类上创建一个方法
invokeClassMethod:
,如下所示:
-(NSString *)invokeClassMethod:(NSString *)someString {
    return [SomeOtherClass classMethod:someString];
}
然后在你的测试中,你创建一个局部模拟并期望
invokeClassMethod:
-(void)testSomething {
    id partialMock = [OCMockObject partialMockForObject:actual];
    [[[partialMock expect] andReturn:@"foo"] invokeClassMethod:@"bar"];

    [actual doSomething:@"bar"];

    [partialMock verify];
}
如果要验证是否未调用
invokeClassMethod
,则可以抛出异常:
-(void)testSomethingElse {
    id partialMock = [OCMockObject partialMockForObject:actual];
    [[[partialMock stub] andThrow:[NSException exceptionWithName:@"foo" reason:@"Should not have called invokeClassMethod:" userInfo:nil] invokeClassMethod:OCMOCK_ANY];

    [actual doSomething:@"bar"];
}
如果调用
invokeClassMethod
,则激活将导致测试失败。     
正如zneak在对你的问题的评论中提到的那样,看看这个答案, 并从那里的评论,结帐这种基于块的类方法调度实现。
OCMock
似乎没有直接支持你想做的事情,但这个解决方案非常好!     
或者,假设你有这个类:
@interface ABCCleverClass : NSObject
+ (id)specialMethod;
@end
而你想要模拟这个类方法。一种选择是在此类上创建一个类别,用于定义和实现测试支持。然后,您可以将测试类中的类方法的实现与类别中的模拟方法交换。
#import <objc/runtime.h>

@interface ABCCleverClass (TestSupport)
+ (id)mockSpecialMethod;
@end

@implementation ABCCleverClass (TestSupport)

+ (void)load {
  Method original = class_getClassMethod([ABCCleverClass class], @selector(specialMethod));
  Method mocked = class_getClassMethod([ABCCleverClass class], @selector(mockSpecialMethod));
  method_exchangeImplementations(original, mocked);
}

+ (id)mockSpecialMethod {
  // Perform mock method. You may need to add more class methods
  // in order to configure this.
}

@end
    

要回复问题请先登录注册