Usando Moq y miré Callback
pero no he podido encontrar un ejemplo simple para entender cómo usarlo.
¿Tiene un pequeño fragmento de trabajo que explique claramente cómo y cuándo usarlo?
Difícil de superar https://github.com/Moq/moq4/wiki/Quickstart
Si eso no es lo suficientemente claro, lo llamaría un error de documentación ...
EDITAR: En respuesta a su aclaración ...
Por cada método simulado Setup
que realice, podrá indicar cosas como:
El .Callback
mecanismo dice "No puedo describirlo en este momento, pero cuando suceda una llamada con esta forma, llámame y haré lo que sea necesario". Como parte de la misma cadena de llamadas fluida, puedes controlar el resultado que se devolverá (si lo hay) a través de .Returns
". En los ejemplos de QS, un ejemplo es que hacen que el valor devuelto aumente cada vez.
En general, no necesitará un mecanismo como este con mucha frecuencia (los patrones de prueba de xUnit tienen términos para antipatrones de la clase Conditional Logic In Tests), y si hay alguna forma más simple o incorporada de establecer lo que necesita, debería ser utilizado con preferencia.
La parte 3 de 4 en la serie Moq de Justin Etheredge lo cubre, y hay otro ejemplo de devoluciones de llamada aquí.
Puede encontrar un ejemplo simple de devolución de llamada en Uso de devoluciones de llamada con publicación de Moq .
Callback
no tiene nada que ver con el valor de retorno (a menos que lo vincules a través del código). Básicamente, solo se asegura de que se llame a la devolución de llamada antes o después de cada invocación (dependiendo de si la encadenó antes o despuésReturns
respectivamente), simple y llanamente.A continuación, se muestra un ejemplo del uso de una devolución de llamada para probar una entidad enviada a un servicio de datos que maneja una inserción.
Sintaxis alternativa del método genérico:
Entonces puedes probar algo como
fuente
It.Is<T>
in a enMock.Verify
lugar de ensuciar la prueba con temps. Pero +1 porque apuesto a que hay mucha gente que trabajará mejor con un ejemplo.Hay dos tipos de
Callback
en Moq. Uno ocurre antes de que vuelva la llamada; el otro ocurre después de que regresa la llamada.En ambas devoluciones de llamada, podemos:
fuente
Callback
es simplemente un medio para ejecutar cualquier código personalizado que desee cuando se realiza una llamada a uno de los métodos de la simulación. He aquí un ejemplo sencillo:Recientemente me encontré con un caso de uso interesante para él. Suponga que espera algunas llamadas a su simulacro, pero ocurren al mismo tiempo. Por lo tanto, no tiene forma de saber el orden en el que se llamarían, pero desea saber las llamadas que esperaba que se realizaran (independientemente del orden). Puedes hacer algo como esto:
Por cierto, no se confunda con la distinción engañosa "antes
Returns
" y "despuésReturns
". Es simplemente una distinción técnica de si su código personalizado se ejecutará después deReturns
haber sido evaluado o antes. A los ojos de la persona que llama, ambos se ejecutarán antes de que se devuelva el valor. De hecho, si el método esvoid
-returning, ni siquiera puede llamarReturns
y, sin embargo, funciona igual. Para obtener más información, consulte https://stackoverflow.com/a/28727099/67824 .fuente
Además de las otras buenas respuestas aquí, lo he usado para realizar lógica antes de lanzar una excepción. Por ejemplo, necesitaba almacenar todos los objetos que se pasaron a un método para su posterior verificación, y ese método (en algunos casos de prueba) necesitaba lanzar una excepción. Llamando
.Throws(...)
enMock.Setup(...)
anula laCallback()
acción y nunca se lo llama. Sin embargo, al lanzar una excepción dentro de la devolución de llamada, aún puede hacer todas las cosas buenas que una devolución de llamada tiene para ofrecer y aún así lanzar una excepción.fuente