2013-03-01 8 views
12

Passare un oggetto OCMock a un metodo in cui la funzione chiama èKindOfClass. Tuttavia per il test unitario, il valore restituito non è della classe derisa, ma OCMockObjectCome ottenere il valore deriso quando si chiama isKindOfClass per un oggetto OCMock?

+1

OCMockObject sembra essere la classe base per quel framework. Stai chiamando + (id) mockForClass: Class e ti stai chiedendo perché l'oggetto creato non si riporti come classe derisa? – JiuJitsuCoder

+0

Se il problema persiste, puoi presentare il tuo caso d'uso? Cosa stai cercando di fare? Alcuni codici aiuterebbero l'analisi. –

+0

Può essere utile per ogni classe factory che crea oggetti in base alla classe di un parametro. Nel mio caso devo creare oggetti reali invece di simulare per testare queste fabbriche. – Giuseppe

risposta

0

Se si desidera passare OCMock a un metodo in cui la funzione chiama isKindOfClass, è necessario creare una simulazione parziale. Il seguente codice potrebbe aiutarti. Ha funzionato per me.

-(void)testMyTest 
{ 
    FirstViewController* masterVC = [[FirstViewController alloc]init]; 
    SecondViewController *second = [[SecondViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:second]; 
    [[master expect] getName:@"PARAM"]; 
    [masterVC doSomething:master]; 
    [master verify]; 

    [masterVC release]; 
    [second release]; 
} 

metodo doSomething all'interno FirstViewController

-(void)doSomething:(SecondViewController *)detail 
{ 
    if ([detail isKindOfClass:[SecondViewController class]]) 
    { 
     NSString * returnVal = [detail getName:@"PARAM"]; 
     NSLog(@"returnVal %@",returnVal); 
    } 
} 

Un'altra alternativa sta prendendo in giro il metodo isKindOfClass, Così il banco di prova sarà

- (void)testMyTest 
{ 
    CalculatorViewController* masterVC = [[CalculatorViewController alloc]init]; 
    id master = [OCMockObject niceMockForClass:[SecondViewController class]]; 
    BOOL ret = YES; 
    [[[master expect] andReturnValue:OCMOCK_VALUE(ret)] isKindOfClass:[SecondViewController class]]; 
    [[master expect] getName:@"PARAM"]; 
    [masterVC doSomething:master]; 
    [master verify]; 
} 
+0

Il vantaggio dell'utilizzo di un mock/niceMock è che non è necessario creare un'istanza dell'oggetto. Nel mio caso la creazione di quell'oggetto è difficile. – Giuseppe

+0

ok. Un'alternativa è prendere in giro il metodo isKindOfClass. qualcosa come questo id master = [OCMockObject niceMockForClass: [SecondViewController class]]; BOOL ret = YES; // può cambiare il valore [[[master expect] andReturnValue: OCMOCK_VALUE (ret)] isKindOfClass: [SecondViewController class]]; –

+0

Quello che faccio è usare un niceMock e stubare il metodo "class" per restituire la classe derisa. Questo è più affidabile per restituire SÌ per qualsiasi tipo di classe. Perché questo non è il comportamento predefinito di OCMock non è chiaro per me. – Giuseppe

Problemi correlati