Я просто практикуя OCMock
, проблема я столкнулся здесьВозвращение CGRect из издевались метода врезается
Я один метод с именем foo
, который возвращает CGRect
, этот метод вызывается из другого метода callFoo
.
-(CGRect)foo {
return CGRectMake(10, 10, 10, 10);
}
-(void)callFoo {
CGRect rect = [self foo];
NSLog(@"%@",NSStringFromCGRect(rect));
}
Мой блок тест для 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];
обновление:
Это выглядит как проблема с памятью [но я не уверен, просто догадка].
Передразнивало метод даст мне правильную структуру, если создать структуру с 2 CGFloat
переменными, в то время как он будет вылетать, если создать структуру с 2 double
переменных или 3 CGFloat
переменными.
Интересно :)
Это похоже на ошибку в OCMock.Это заканчивается тем, что foo указывает на нулевую реализацию в частичном макете (вы, возможно, видели, что если вы вызываете foo напрямую, вы можете пройти тест). Обходным путем (по общему признанию, не большим) было бы поместить foo в другой класс и издеваться над этим. –
Я не уверен, что это ошибка в OCMock, но когда я попытался с пользовательской структурой, которая похожа на CGRect, т.е. struct содержит две структуры (struct1 & struct2), которая содержит в себе две переменные. Но результат такой же, он разбился. Но если я structs ie struct1 и struct2 содержит только одну переменную, то тест пройдет –
Это была ошибка в OCMock, которая была исправлена сейчас: https://github.com/erikdoe/ocmock/pull/41 Если вы смотрите на комментарии по запросу pull, вы увидите, почему были проблемы только с некоторыми (обычно большими) структурами. –