Как проверить, вызывается ли метод объекта внутри блока обработчика завершения с помощью OCMock?

У меня есть метод:

@implementation SomeClass

- (void)thisMethod:(ObjectA *)objA {
    [APIClient connectToAPIWithCompletionHandler:^(id result){
        if (result) [objA methodOne];
        else [objA methodTwo];
    }];
}

Есть ли способ проверить, будет ли вызываться methodOne или methodTwo при вызове thisMethod:? По сути, я просто хочу заглушить этот метод connectToAPIWithCompletionHandler:. Прямо сейчас я могу сделать это, используя метод connectToAPIWithCompletionHandler:. Но я хочу знать, есть ли лучший способ.

Я нашел аналогичный вопрос здесь, но он использует метод экземпляра, а в моем случае - метод класса .


person Nico Prananta    schedule 17.07.2013    source источник


Ответы (1)


Попробуй это:

- (void)test_thisMethod {
    id mockA = [OCMockObject mockForClass:[ObjectA class]];
    id mockClient = [OCMockObject mockForClass:[APIClient class]];

    // Use class method mocking on APIClient
    [[mockClient expect] andDo:(NSInvocation *invocation) {
        void (^completion)(id result) = [invocation getArgumentAtIndexAsObject:2];
        completion(nil);
    }] connectToAPIWithCompletionHandler:OCMOCK_ANY];

    [[mockA expect] methodTwo];

    [[SomeClass new] thisMethod:mockA];

    [mockA verify];
    [mockClient verify];        
}

Обратите внимание, что я набрал это прямо в браузере, но, надеюсь, это близко к работе.

person Ben Flynn    schedule 17.07.2013
comment
Спасибо! оно работает! Я просто хочу подтвердить свое понимание, поэтому для метода класса фиктивный объект не нужно передавать тестируемому методу. В то время как метод экземпляра должен быть передан тестируемому методу. Это так? - person Nico Prananta; 18.07.2013
comment
Да, это хороший способ думать об этом. Синтаксис, который использует OCMock, удобен, но он маскирует, насколько отличается насмешка над методом класса. - person Ben Flynn; 18.07.2013