OCMock вперед к исходному методу класса

OCMock предлагает хороший синтаксис для имитации методов класса, но можно ли перенаправить вызовы методов класса на реальный объект класса?

self.connectionMock = [OCMockObject mockForClass:NSURLConnection.class];

[[[[self.connectionMock stub] andDo:^(NSInvocation *invocation) {
    NSURL *url = [invocation getArgumentAtIndexAsObject:2];
    NSLog(@"Passing through mock: %@", url);
} ] andForwardToRealObject] connectionWithRequest:OCMOCK_ANY delegate:OCMOCK_ANY];

Проблема в том, что andForwardToRealObject работает только для частичных. Я мог бы сделать этот метод сам, но есть ли простой способ вызвать исходный метод класса с помощью OCMock?


person Ben Flynn    schedule 25.10.2013    source источник
comment
Можете ли вы использовать частичный макет с классом вместо объекта?   -  person Josh The Geek    schedule 25.10.2013
comment
@JoshTheGeek К сожалению, Class не является NSObject, поэтому вы не можете создать для него частичный макет. Если вы попытаетесь создать частичный макет для экземпляра, он не сможет перенаправить метод класса, поскольку он не ищет селекторы методов класса.   -  person Ben Flynn    schedule 25.10.2013
comment
Может есть другой подход. Можете ли вы объяснить более широко, что вы пытаетесь проверить?   -  person Christopher Pickslay    schedule 25.10.2013
comment
Я должен признать, что на самом деле я не пытался что-то протестировать в этом случае, по крайней мере, модульное тестирование. Я пишу некоторый код для захвата запросов и ответов NSURLConnection - в основном сквозной. Я думал, что это может быть однострочник с OCMock, но это было не так уж плохо, просто написать код подкачки методов. В общем, возможно, что кто-то захочет передать вызов метода класса реальному методу класса по тем же причинам, что и с методами экземпляра.   -  person Ben Flynn    schedule 26.10.2013


Ответы (1)


Подкласс OCMock и переопределение селектора forwardingTargetForSelector:(SEL):

+(id)forwardingTargetForSelector:(SEL)selector
{
    Class yourClass = [classObject class];
    return yourClass;
}

(Кредит: "Как я могу перенаправить методы класса в Objective-C ?"

person moonman239    schedule 17.06.2016