2010-01-13 17 views
10

Uso de RhinoMocks - ¿Puedo recuperar los parámetros de una función llamada? Quiero decir; ¿Puedo obtener algunos de los parámetros desconocidos de la llamada de función?RhinoMocks - Obtención de parámetros de las funciones llamadas

Tengo un simulacro, y espero que se invoque alguna función sobre esto. Conozco uno de los parámetros, pero el otro es desconocido ya que proviene de la clase que usa el simulacro y le llama una función. Más específicamente, en este caso, el argumento desconocido es una función lambda. Esta es una función de devolución de llamada que se supone que se llama cuando la función se termina de ejecutar. Como el simulacro evita que se llame, quiero buscarlo y llamarlo yo mismo.

So; Quiero verificar que se haya llamado a la función. Quiero asegurarme de que algunos de los argumentos fueron los esperados. Y quiero sacar los argumentos desconocidos para hacer algunas operaciones con ellos luego.

Suponiendo que ambos argumentos son enteros (por simplicidad) Me gustaría hacer algo como esto:

int unknownInt; 
_fakeSomething.AssertWasCalled(factory => factory.Foo(1, out unknownInt)); 
// then play around with unknownInt.. 

se puede hacer esto? Veo que hay un Arg.Out, pero no pude hacer que funcione ..

Nota: Se ha actualizado la pregunta, ya que parecía ser engañosa.

Respuesta

14
Arg<string>.Matches(arg => you got the argument here...); 

ACTUALIZACIÓN:

a buscar el segundo argumento presentado en la primera llamada del método Foo en _fakeSomething:

string someArg = null; 
var args = _fakeSomething.GetArgumentsForCallsMadeOn(
    x => x.Foo(0, 0), 
    x => x.IgnoreArguments() 
); 
var int = (int)args[0][1]; 
+0

Gracias. Pero por lo que entendí, ¿esto es una coincidencia simple? ¿O puedo usar esto para sacar el argumento? Quiero sacar el argumento. Mi pregunta podría haber sido engañosa, así que actualicé el texto de mi pregunta. – stiank81

+0

Ahora está más claro, mira mi actualización. –

+0

¡Eso es todo! ¡Gracias! – stiank81

0

No estoy seguro si se puede hacer, pero las pruebas de esa manera puede resultar en pruebas poco fiables, ya que no conoce el parametro real que fue aprobada en.

Si es posible, prueba en datos explícitos. Si obtienes pasar nulo en lugar de un valor real, tu prueba probablemente pase por el motivo equivocado.

Pruebas con Arg.Is.Todo debe hacerse con cuidado y cuando realmente no le importa el parámetro, como en AssertWasNotCalled.

+0

No estoy de acuerdo con usted. Para mencionar un ejemplo, tengo un proxy de servicio que simula. Inyerto este proxy de servicio cuando creo un objeto foo de alguna clase que lo usará. Luego invoco una función en el objeto foo, y espero que esta función invoque una función en el simulador de servicio proxy con algunos argumentos que espero, y también una función de devolución de llamada que es privada para la clase. Ahora quiero verificar que la función fue llamada con los argumentos esperados, pero no puedo verificar la devolución de llamada privada y, por lo tanto, especificar Arg.Is.Anything. No me importa esa discusión, ¿por qué no debería? – stiank81

+1

Ahh ya veo. También he tenido problemas para probar callbacks y lambdas. Llegué a la conclusión de que mi diseño estaba equivocado. Lo bueno de las pruebas, y especialmente TDD es que te dice cuándo tu diseño es incorrecto. Si su diseño está mal o no, no puedo decírselo, pero si encuentra que su código es difícil de probar, tal vez debería reconsiderar su diseño. – Henning

Cuestiones relacionadas