Imagina esta clase
public class Foo {
private Handler _h;
public Foo(Handler h)
{
_h = h;
}
public void Bar(int i)
{
_h.AsyncHandle(CalcOn(i));
}
private SomeResponse CalcOn(int i)
{
...;
}
}
Mo (q) cking Handler en una prueba de Foo, ¿cómo podría verificar qué Bar()
ha pasado _h.AsyncHandle
?
Respuestas:
Puede usar el método Mock.Callback:
Si solo desea verificar algo simple en el argumento pasado, también puede hacerlo directamente:
fuente
Callback<>()
método genérico Moq. Por ejemplo, si tu método tuviera la definiciónHandler.AnsyncHandle(string, SomeResponse)
, necesitarías/* ... */.Callback<string, SomeResponse>(r => result = r);
. No he encontrado esto explícitamente en muchos lugares, así que pensé que lo agregaría aquí./* ... */.Callback<string, SomeResponse>((s1, s2) => { str1 = s1; result = s2});
.Callback((string s1, SomeResponse s2) => /* stuff */ )
Capture.In
ayudante incorporado ?La respuesta de Gamlor funcionó para mí, pero pensé que podría ampliar el comentario de John Carpenter porque estaba buscando una solución que involucrara más de un parámetro. Me imaginé que otras personas que se topan con esta página pueden estar en una situación similar. Encontré esta información en la documentación de Moq .
Usaré el ejemplo de Gamlor, pero supongamos que el método AsyncHandle toma dos argumentos: ay
string
unSomeResponse
objeto.Básicamente, solo necesita agregar otro
It.IsAny<>()
con el tipo apropiado, agregar otro tipo alCallback
método y cambiar la expresión lambda según corresponda.fuente
El método de devolución de llamada ciertamente funcionará, pero si está haciendo esto en un método con muchos parámetros, puede ser un poco detallado. Aquí hay algo que he usado para eliminar parte de la placa repetitiva.
Aquí está la fuente de ArgumentCaptor:
fuente
La respuesta de Gamlor funciona, pero otra forma de hacerlo (y una que considero más expresiva en la prueba) es ...
Verify es muy poderoso y vale la pena tomarse el tiempo para acostumbrarse.
fuente
La alternativa también es utilizar la
Capture.In
función demoq
. Es lamoq
característica OOTB que permite capturar argumentos en la colección.fuente
Callback
IMO. Dado que utiliza Capture directamente en la lista de parámetros, es mucho menos propenso a problemas al refactorizar la lista de parámetros de un método y, por lo tanto, hace que las pruebas sean menos frágiles. Con Callback, debe mantener los parámetros pasados en la Configuración sincronizados con los parámetros de tipo utilizados para Callback, y definitivamente me ha causado problemas en el pasado.Podrías usar
It.Is<TValue>()
matcher.fuente
Esto también funciona:
fuente
Muchas buenas respuestas aquí! Vaya con el conjunto de características Moq listo para usar hasta que necesite hacer afirmaciones sobre varios parámetros de clase pasados a sus dependencias. Sin embargo, si termina en esa situación, la función de verificación de Moq con It. Sus coincidencias no hace un buen trabajo al aislar la falla de la prueba, y la forma de devolución / devolución de llamada de capturar argumentos agrega líneas de código innecesarias a su prueba (y las pruebas largas son un no-go para mí).
Aquí hay una idea general: https://gist.github.com/Jacob-McKay/8b8d41ebb9565f5fca23654fd944ac6b con una extensión Moq (4.12) que escribí que ofrece una forma más declarativa de hacer afirmaciones sobre los argumentos pasados a los simulacros, sin los inconvenientes mencionados anteriormente. Así es como se ve la sección Verificar ahora:
Me entusiasmaría si Moq proporcionara una función que lograra lo mismo mientras fuera declarativa y proporcionara el aislamiento de falla que esto hace. ¡Dedos cruzados!
fuente