OCMock: заставь заглушку сделать что-нибудь - PullRequest
1 голос
/ 27 января 2009

Я привыкаю к ​​OCMock. Исходя из фона Java / JMock, я сейчас ищу возможность сказать [[[myMock stub] returnValueFromCustomMethod] someMockedMethod];, где returnValueFromCustomMethod определено в тестовом классе. Первоначально я думал о чем-то в соответствии с условиями [[[myMock stub] usingSelector:@selector(myMethod:)] someMockedMethod];, но после написания я задаюсь вопросом, имеет ли мой первый подход больше смысла. В любом случае, кто-то может показать мне, если и как это можно сделать?

1 Ответ

0 голосов
/ 06 февраля 2009

Мой оригинальный ответ был не верен: 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) скрыты основа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...