2013-05-15 10 views
14

Stavo solo praticando OCMock, Il problema che sto affrontando qui èTornando CGRect dal metodo preso in giro si blocca

ho un metodo chiamato foo che restituisce CGRect, questo metodo viene chiamato da un altro metodo callFoo.

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

Il mio test di unità per callFoo metodo è muggito.

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

Quando questo tipo di test viene eseguito, sto ottenendo un incidente inaspettato quando raggiunge CGRect rect = [self foo];
volevo sapere perché questo incidente sta accadendo se torniamo CGRect da mocked method e come risolvere questo incidente.

Qualcuno potrebbe aiutare a risolvere questo problema.

Grazie in anticipo.

P.S: Funziona bene se sostituisco CGRect con NSValue. As shown below

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

e nel mio caso di test,

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

aggiornamento:
Questo appare come problema con la memoria [ma non sono sicuro, solo una supposizione].

metodo deriso mi darà corretta struttura se creo una struttura con 2 CGFloat variabile, mentre andrà in crash se creo la struttura con 2 double variabile o 3 CGFloat variabile.

Interessante :)

+3

Questo sembra essere un bug in OCMock.Finisce con il fare di punta a un'implementazione nulla all'interno della simulazione parziale (potresti aver visto che se chiami direttamente foo puoi far passare il test). Una (certamente non eccezionale) soluzione sarebbe quella di mettere il foo in una classe diversa e deriderlo. –

+0

Non sono sicuro se si tratta di un bug in OCMock, ma quando ho provato con struct personalizzata che è simile a CGRect ie. struct contiene due struct (struct1 e struct2) che contiene due variabili in esso. Ma il risultato è lo stesso, si è schiantato. Ma se le struct ie struct1 e struct2 contengono solo una variabile al suo interno allora il test supererà –

+1

Questo era un bug in OCMock, che è stato corretto ora: https://github.com/erikdoe/ocmock/pull/41 Se guardi i commenti sulla richiesta di pull, vedrai perché c'erano solo problemi con alcune (di solito grandi) strutture. –

risposta

0

Questo sembra essere un bug in OCMock. che è stato risolto ora.

4

OCMOCK_VALUE è di solito per le primitive (BOOL, NSInteger, ecc) Sembra che OCMOCK_VALUE non funziona bene con le strutture, in base ai seguenti link.

Se si utilizzano le categorie previste dalla posta OCMock Return a struct, si può fare qualcosa di simile:

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

In alternativa, è possibile utilizzare 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

Ho provato 'CGRect rect = {0, 0, 0, 0}; NSValue * valRect = [valore NSValueWithBytes: & rect objCType: @encode (CGRect)]; [[[master expect] andReturnValue: valRect] foo]; 'ma si è bloccato. –

+0

Hai provato '[[[master expect] andReturn: valRect] foo];'? – catcyborg

+0

Sì, ho provato anche quello con lo stesso risultato. –

Problemi correlati