2012-04-24 11 views
6

Qualcuno sa come acquisire un argomento inviato a un oggetto OCMock?Come acquisire un argomento inviato a una simulazione?

id mock = [OCMockObject mockForClass:someClass] 
NSObject* captureThisArgument; 
[[mock expect] foo:<captureThisArgument>] 

[mock foo:someThing] 
GHAssertEquals[captured, someThing, nil]; 

Come si fa a convalidare l'argomento di cui si deve fare a meno? Sono felice di farlo anche all'interno di un blocco nella definizione di simulazione, ma se riuscissi a estrarre l'oggetto in modo tale da poterlo affermare in seguito, sarebbe fantastico.

Questo è possibile con OCMock?

risposta

9

Se si desidera convalidare il vostro parametro forse si può farlo direttamente mentre si sta impostando una stub con qualcosa di simile:

id mock = [OCMockObject mockForClass:someClass]; 
NSObject* captureThisArgument; 
[[mock expect] foo:[OCMArg checkWithBlock:^(id value){ 
    // Capture argument here... 
}]]; 

Saluti, Quentin A

+0

Mi piace. È simile a come andrei a fare il sarcasmo con un matcher hancrest in groovy. Grazie :). –

3

È possibile stub la chiamata e passare ad un blocco che verifica:

NSObject *expected = ...; 

id mock = [OCMockObject mockForClass:someClass] 
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) { 
    NSObject *actual; 
    [invocation getArgument:&actual atIndex:2]; 
    expect(actual).toEqual(expected); 
}; 
[[[mock stub] andDo:theBlock] foo:[OCMArg any]]; 

[mock foo:expected]; 

C'è anche una versione di callback di questo, ma il flusso di controllo diventa più complesso, come avete bisogno di una variabile di stato che è visibile sia per il test e la richiamata verifica:

[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument] 
+1

Grazie. @ La risposta di Quentin è stata quella concisa che speravo, ma apprezzo molto anche il tuo esempio. È utile avere un esempio di come convalidare più argomenti in fase di simulazione. (Avrei buttato delle asserzioni in theBlock se qualcosa non andava bene). –

+0

I primi due argomenti di un NSInvocation sono riservati per self e _cmd; l'argomento "primo" di un metodo è nell'indice 2. – titaniumdecoy

+0

Buona cattura @titaniumdecoy. Aggiornato la mia risposta. –

Problemi correlati