2013-05-15 20 views
14

właśnie praktykuje OCMock problem jestem stoi tu jestWracając CGRect od sposobu wyśmiewali wywala

Mam jedną metodę o nazwie foo która zwraca CGRect, metoda ta jest wywoływana z innej metody callFoo.

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

Mój test jednostkowy dla metody callFoo jest poniżej.

- (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]; 
} 

Gdy ten przypadek testowy działa, jestem coraz nieoczekiwaną awarię gdy osiągnie CGRect rect = [self foo];
Chciałem wiedzieć, dlaczego tak się dzieje, jeśli awaria wracamy CGRect od mocked method i jak rozwiązać ten wypadek.

Czy ktoś może pomóc rozwiązać ten problem.

Z góry dziękuję.

P.S: Działa to dobrze, jeśli zmienię CGRect na NSValue. As shown below

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

iw moim przypadku testowego,

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

zmiana:
To wygląda problem z pamięcią [ale nie jestem pewien, tylko przypuszczenie].

Wyśmiewana metoda da mi prawidłową strukturę, jeśli stworzę strukturę z 2 CGFloat zmienną, natomiast zawiesi się, jeśli utworzę strukturę ze zmienną 2 double lub 3 CGFloat.

Ciekawe :)

+3

To wydaje się być błędem w OCMock.Kończy się to, że foo wskazuje na zerową implementację w ramach częściowej sztuczki (być może widziałeś, że jeśli zadzwonisz bezpośrednio do foo, możesz uzyskać test do zaliczenia). (Wprawdzie nie świetne) obejście byłoby postawić foo w innej klasie i kpić z tego. –

+0

Nie jestem pewien, czy jest to błąd w OCMock, ale gdy próbowałem z niestandardowej struktury, która jest podobna do CGRect tj. struct zawiera dwie struktury (struct1 i struct2), które zawierają dwie zmienne. Ale wynik jest taki sam, rozbił się. Ale jeśli struktury, tj. Struct1 i struct2 zawierają tylko jedną zmienną, test przejdzie –

+1

To był błąd w OCMock, który został naprawiony teraz: https://github.com/erikdoe/ocmock/pull/41 If spójrz na komentarze na temat żądania wyciągnięcia, zobaczysz, dlaczego wystąpiły problemy tylko z niektórymi (zwykle dużymi) strukturami. –

Odpowiedz

0

To wydaje się być bug w OCMock. który jest teraz naprawiony.

4

OCMOCK_VALUE jest zwykle dla prymitywów (BOOL, NSInteger, itd.) Wydaje się, że OCMOCK_VALUE nie działa dobrze z kodowanym, według poniższych linków.

Jeśli używasz kategorie świadczonych przez pocztę OCMock Return a struct, można zrobić coś takiego:

- (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]; 
} 

Alternatywnie, można użyć OCMOCK_STRUCT fr om 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

Próbowałem 'CGRect rect = {0, 0, 0, 0}; NSValue * valRect = [NSValue valueWithBytes: & rect objCType: @ kodode (CGRect)]; [[[master oczekiwać] andReturnValue: valRect] foo]; 'ale się zawiesił. –

+0

Czy wypróbowałeś '[[[master oczekiwać] iReturn: valRect] foo];'? – catcyborg

+0

Tak, próbowałem, że również nadal ten sam wynik. –

Powiązane problemy