Tengo una interfaz que declara
Task DoSomethingAsync();
Estoy usando MoqFramework para mis pruebas:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
Luego en mi prueba ejecuto el código que invoca await DoSomethingAsync()
. Y la prueba simplemente falla en esa línea. ¿Qué estoy haciendo mal?
c#
unit-testing
task-parallel-library
moq
Waldemar
fuente
fuente
Respuestas:
Su método no tiene devoluciones de llamada, por lo que no hay razón para usarlo
.CallBack()
. Simplemente puede devolver una tarea con los valores deseados usando.Returns()
y Task.FromResult , por ejemplo:Actualización 2014-06-22
Moq 4.2 tiene dos nuevos métodos de extensión para ayudar con esto.
Actualizar 2016-05-05
Como Seth Flowers menciona en la otra respuesta ,
ReturnsAsync
solo está disponible para los métodos que devuelven aTask<T>
. Para los métodos que devuelven solo una tarea,puede ser usado.
Como se muestra en esta respuesta , en .NET 4.6 esto se simplifica a
.Returns(Task.CompletedTask);
, por ejemplo:fuente
.Returns(Task.FromResult(default(object))
funciona bien cuando el tipo de retorno es nulo..Returns(Task.FromResult(null as MyType))
funciona bien cuando el tipo de retorno esperado es nulo.default(object)
ya no es necesario.null as MyType
es el mismo quedefault(MyType)
el tiempo queMyType
es un tipo de referencia.Problema similar
Tengo una interfaz que se parecía más o menos a:
Síntomas
La prueba de mi unidad falló cuando mi servicio bajo prueba fue
awaited
llamadoDoSomething
.Reparar
A diferencia de la respuesta aceptada, no puede invocar
.ReturnsAsync()
suSetup()
método en este escenario, porque el método devuelve el no genéricoTask
, en lugar deTask<T>
.Sin embargo, aún puede usarlo
.Returns(Task.FromResult(default(object)))
en la configuración, lo que permite que la prueba pase.fuente
Solo necesita agregar
.Returns(Task.FromResult(0));
después de la devolución de llamada.Ejemplo:
fuente
Ahora también puede usar el paquete Talentsoft.Moq.SetupAsync https://github.com/TalentSoft/Moq.SetupAsync
En la base de las respuestas encontradas aquí y las ideas propuestas a Moq pero aún no implementadas aquí: https://github.com/moq/moq4/issues/384 , simplifica enormemente la configuración de los métodos asíncronos
Pocos ejemplos encontrados en respuestas anteriores realizadas con la extensión SetupAsync:
fuente