¿Cómo se prueba el código asíncrono usando MSTest?

88

Estoy escribiendo un código asincrónico súper simple. Simplemente guardando un archivo fuera del hilo.

Me gustaría probar este código usando el marco de prueba de unidad MSTest en Microsoft Visual Studio Team System 2008.

¿Cómo hago esto?

Me gustaría bloquear el método de prueba hasta que el método regrese. Puedo imaginar algunas formas de hacer esto, pero estoy asombrado de que no haya mejores prácticas o clases de ayuda al respecto.

Veo mucho para Silverlight, pero nada genérico.

Kevin Moore
fuente
4
¿Duplicar? stackoverflow.com/questions/1174702/… (Creo que las respuestas proporcionadas no están directamente relacionadas con qué marco de prueba se utiliza)
Fredrik Mörk
1
sí lo es, y creo que la respuesta será la misma.
Andras Zoltan

Respuestas:

162

Visual Studio 2012 (anteriormente conocido como "Visual Studio 11") introdujo soporte para pruebas asíncronas . Se parece a esto:

[TestMethod]
public async Task FooTest()
{
   var result = await SomeAsyncOperation();
   Assert.IsTrue(someCondition);
}

Como se señaló en los comentarios, el Tasktipo de devolución es importante . No funcionará si declara que el método regresa void.

Wim Coenen
fuente
58
Tenga en cuenta que el Tasktipo de devolución es obligatorio; voidno funcionará (al menos no en la actualización 4 de VS2013)
Ohad Schneider
3
(Nunca funcionará, ya que voidno se pueden esperar los métodos asincrónicos de retorno)
Richard Szalay
1
@RichardSzalay: se puede hacer que funcione, vea aquí cómo lo hace NUnit: stackoverflow.com/questions/15031681/…
Wim Coenen
-3

En lugar de llamar directamente a los métodos System.IO, intente utilizar la biblioteca SystemWrapper . Luego, en sus pruebas, puede simular las llamadas como desee, devolver lo que quiera a su prueba, incluidas las condiciones de error, y verificar que su lógica funcione como se esperaba.

Si desea ver un ejemplo, eche un vistazo a esta publicación de blog que muestra cómo se puede usar con RhinoMocks.

Richard Banks
fuente
3
No veo esto como una respuesta a la pregunta
SteveC