Ответ 1
Кажется, это ошибка в OCMock
. который теперь исправлен.
Я просто практиковал 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
.
Интересно:)
Кажется, это ошибка в OCMock
. который теперь исправлен.
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];
}