2014-10-27 109 views
3

OCMock 3中的新功能可以剔除class methodsOCMock模拟协议的静态类方法。

是否可以模拟协议中定义的类方法?即

@protocol AViewControllerProtocol <NSObject> 
+ (Type)typeForViewController; 
@end 

在我的单元测试类

- (void)testProtocolClassMethod { 
    id mockedViewController = OCMProtocolMock(@protocol(AViewControllerProtocol)); 

    //This line compiles fine, but throws an exception at run time. 
    OCMStub([mockedViewController typeForViewController]).andReturn(SomeType); 
} 

异常抛出

NSInvalidArgumentException:不能存根/期望/验证方法 'typeForViewController',因为没有这样的方法在嘲笑

类存在

回答

0

这看起来像是一个oversig在OCMock 3.1中,但如果你愿意,你可以自己修复。

// OCProtocolMockObject.m 
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 
{ 
    struct objc_method_description methodDescription = protocol_getMethodDescription(mockedProtocol, aSelector, YES, YES); 
    if(methodDescription.name == NULL) 
    { 
     methodDescription = protocol_getMethodDescription(mockedProtocol, aSelector, NO, YES); 
    } 
    // Add this case for required class methods 
    if (methodDescription.name == NULL) 
    { 
     methodDescription = protocol_getMethodDescription(mockedProtocol, aSelector, YES, NO); 
    } 
    // Add this case for optional class methods 
    if (methodDescription.name == NULL) 
    { 
     methodDescription = protocol_getMethodDescription(mockedProtocol, aSelector, NO, NO); 
    } 
    if(methodDescription.name == NULL) 
    { 
     return nil; 
    } 
    return [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; 
} 

我验证了这个解决与此测试:

- (void)testProtocolClassMethod { 
    id mockedViewController = OCMProtocolMock(@protocol(AViewControllerProtocol)); 

    // FIXED: This line compiles fine, but throws an exception at run time. 
    OCMStub([mockedViewController typeForViewController]).andReturn(SomeType); 

    Type type = [mockedViewController typeForViewController]; 

    XCTAssertEqual(type, SomeType, @"Not equal!"); 

    OCMVerify([mockedViewController typeForViewController]); 
} 

我会把请求在项目页面上此。

+0

我还没有时间阅读此答案,但它看起来非常感谢。 干得好。 – ajmccall 2014-11-03 09:36:58

+0

使用OCMock 2.2.4并有相同的问题。 – 2014-11-03 09:55:38

+0

我刚刚向主人推荐了一个修复程序。 – 2014-11-19 21:31:22