Возврат CGRect из отложенных методов сбоев - программирование
Подтвердить что ты не робот

Возврат CGRect из отложенных методов сбоев

Я просто практиковал OCMock. Проблема, с которой я столкнулся, -

У меня есть один метод с именем foo, который возвращает CGRect, этот метод вызывается из другого метода callFoo.

-(CGRect)foo {
    return CGRectMake(10, 10, 10, 10);
}
-(void)callFoo {
    CGRect rect = [self foo];
    NSLog(@"%@",NSStringFromCGRect(rect));
}

Мой unit test для метода callFoo приведен ниже.

- (void)test__callFoo__invokesWithMockingFoo
{
     ViewController *sut = [[ViewController alloc] init];
     id master = [OCMockObject partialMockForObject:sut];

     CGRect rect = CGRectMake(0, 0, 0, 0);
     [[[master expect] andReturnValue:OCMOCK_VALUE(rect)] foo];
     [sut callFoo];
     [master verify];
 }

Когда этот тестовый сценарий запускается, я получаю неожиданный сбой, когда он достигает CGRect rect = [self foo];
Я хотел знать, почему этот сбой происходит, если мы вернем CGRect из mocked method и как разрешить этот сбой.

Может ли кто-нибудь помочь решить эту проблему.

Спасибо заранее.

P.S: Это отлично работает, если я заменил CGRect на NSValue. As shown below

 -(NSValue *)foo {
      return [NSValue valueWithCGRect:CGRectMake(10, 10, 10, 10)];
  }
  -(void)callFoo {
      CGRect rect = [[self foo] CGRectValue];
      NSLog(@"%@",NSStringFromCGRect(rect));
  }

и в моем тестовом примере

 NSValue *rect = [NSValue valueWithCGRect:CGRectMake(0, 0, 0, 0)];
 [[[master expect] andReturn:rect] foo];

обновление:
Это похоже на проблему с памятью [но я не уверен, просто догадка].

Метод mocked даст мне правильную структуру, если я создам структуру с переменной 2 CGFloat, тогда как она сработает, если я создам структуру с переменной 2 double или 3 CGFloat.

Интересно:)

4b9b3361

Ответ 2

OCMOCK_VALUE обычно используется для примитивов (BOOL, NSInteger и т.д.). Кажется, что OCMOCK_VALUE не работает с структурами в соответствии со следующими ссылками.

Если вы используете категории, предоставленные post OCMock Верните структуру, вы можете сделать что-то вроде:

- (void)test__callFoo__invokesWithMockingFoo {
     ViewController *sut = [[ViewController alloc] init];
     id master = [OCMockObject partialMockForObject:sut];

     CGRect rect = CGRectMake(0, 0, 0, 0);
     [[[master expect] andReturnStruct:&rect objCType:@encode(CGRect)] foo];
     [sut callFoo];
     [master verify];
 }

В качестве альтернативы вы можете использовать OCMOCK_STRUCT из Использование структуры с OCMock или Hamcrest

- (void)test__callFoo__invokesWithMockingFoo {
     ViewController *sut = [[ViewController alloc] init];
     id master = [OCMockObject partialMockForObject:sut];

     CGRect rect = CGRectMake(0, 0, 0, 0);
     [[[master expect] andReturn:OCMOCK_STRUCT(CGRect, rect)] foo];
     [sut callFoo];
     [master verify];
 }