2014-10-27 3 views
3

Новое в OCMock 3 - это способность издеваться над class methods.Метод статического класса OCMock mock protocol.

Возможно ли издеваться над методами класса, определенными в протоколе? т.е.

@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 ht в 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

+0

Использование OCMock 2.2.4 и с той же проблемой. –

+0

Я только что подтолкнул исправление к мастеру. –

Смежные вопросы