2012-04-24 16 views
6

¿Alguien sabe cómo capturar un argumento enviado a un objeto OCMock?¿Cómo capturo un argumento enviado a un simulacro?

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

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

¿Cómo hago para validar el argumento de foo? Me complace hacerlo dentro de un bloque en la definición de simulacro también, pero si pudiera sacar el objeto para que pueda afirmar en función de eso más tarde sería brillante.

¿Esto es posible con OCMock?

Respuesta

9

Si desea validar el parámetro tal vez usted puede hacerlo directamente mientras se está ajustando su talón con algo como:

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

Saludos, Quentin A

+0

Me gusta esto. Es similar a cómo iba a hacer burlas con un matcher Hancrest en groovy. Gracias :). –

3

Puede derivadas La llamada y pasarlo a un bloque que verifica que:

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

También hay una versión de devolución de llamada de esto, pero el flujo de control se vuelve más complejo, ya que necesita una variable de estado que es visible tanto a su prueba y la devolución de llamada de verificación:

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

Thanks. La respuesta de @ Quentin fue la más concisa que esperaba, pero realmente aprecio tu ejemplo también. Es bueno tener un ejemplo de cómo validar múltiples argumentos en el tiempo de burla. (Lanzaría aserciones en el bloque si algo no estaba bien). –

+0

Los dos primeros argumentos de una Invocación NS están reservados para self y _cmd; el "primer" argumento para un método está en el índice 2. – titaniumdecoy

+0

Buena captura @titaniumdecoy. Actualizado mi respuesta. –

Cuestiones relacionadas