Мой оригинальный ответ был не верен: OCMock не поддерживает это! Если вы хотите изменить OCMock для поддержки этого, вам нужно будет сделать что-то вроде добавления поля BOOL returnValueIsFromInvocation
в OCMockRecorder и добавить метод для его настройки:
- (id)andReturnResultOfInvocation:(NSInvocation *)anInvocation {
returnValueIsFromInvocation = YES;
returnValueIsBoxed = NO;
returnValueShouldBeThrown = NO;
[returnValue autorelease];
returnValue = [anInvocation retain];
return self;
}
Затем научите setUpReturnValue
вызывать вызов (изменения выделены жирным шрифтом):
- (void)setUpReturnValue:(NSInvocation *)anInvocation
{
<b>if (returnValueIsFromInvocation) {
NSInvocation *returnValueInvocation = (NSInvocation *)returnValue;
[returnValueInvocation invoke];
void *buffer = malloc([[anInvocation methodSignature] methodReturnLength]);
[returnValueInvocation getValue:buffer];
[anInvocation setReturnValue:buffer];
free(buffer);
}
else</b> if(returnValueShouldBeThrown)
{
@throw returnValue;
}
else if(returnValueIsBoxed)
{
if(strcmp([[anInvocation methodSignature] methodReturnType],
[(NSValue *)returnValue objCType]) != 0)
[NSException raise:NSInvalidArgumentException
format:@"Return value does not match method signature."];
void *buffer = malloc([[anInvocation methodSignature] methodReturnLength]);
[returnValue getValue:buffer];
[anInvocation setReturnValue:buffer];
free(buffer);
}
else
{
const char *returnType = [[anInvocation methodSignature] methodReturnType];
const char *returnTypeWithoutQualifiers = returnType + (strlen(returnType) - 1);
if(strcmp(returnTypeWithoutQualifiers, @encode(id)) == 0)
[anInvocation setReturnValue:&returnValue];
}
}
Это изменение трудно сделать, введя подклассы, потому что вы должны переопределить методы, которые возвращают OCMockRecorders (например, stub
, expect
и т. Д.), Но конкретные подклассы OCMockObject (OCClassMockObject и OCProtocolMockObject) скрыты основа.