2013-05-15 4 views
14

Я просто практикуя 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 переменными.

Интересно :)

+3

Это похоже на ошибку в OCMock.Это заканчивается тем, что foo указывает на нулевую реализацию в частичном макете (вы, возможно, видели, что если вы вызываете foo напрямую, вы можете пройти тест). Обходным путем (по общему признанию, не большим) было бы поместить foo в другой класс и издеваться над этим. –

+0

Я не уверен, что это ошибка в OCMock, но когда я попытался с пользовательской структурой, которая похожа на CGRect, т.е. struct содержит две структуры (struct1 & struct2), которая содержит в себе две переменные. Но результат такой же, он разбился. Но если я structs ie struct1 и struct2 содержит только одну переменную, то тест пройдет –

+1

Это была ошибка в OCMock, которая была исправлена ​​сейчас: https://github.com/erikdoe/ocmock/pull/41 Если вы смотрите на комментарии по запросу pull, вы увидите, почему были проблемы только с некоторыми (обычно большими) структурами. –

ответ

0

Это кажется bug в OCMock. которая теперь исправлена.

4

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

Если использовать категории, предоставляемые пост OCMock Return a struct, вы можете сделать что-то вроде:

- (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 fr ом Using a struct with OCMock or 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]; 
} 
+0

Я пробовал 'CGRect rect = {0, 0, 0, 0}; NSValue * valRect = [Значение NSValueWithBytes: & rect objCType: @encode (CGRect)]; [[[master expect] andReturnValue: valRect] foo]; 'но он разбился. –

+0

Вы попробовали '[[[[ожидать] и вернуть: valRect] foo];'? – catcyborg

+0

Да, я тоже пробовал, что и тот же результат. –

Смежные вопросы