.net - móviles - manual de programacion android pdf
¿Hay alguna forma de probar un método asíncrono? (4)
Estoy usando Xunit y NMock en la plataforma .NET. Estoy probando un modelo de presentación donde un método es asíncrono. El método crea una tarea asíncrona y la ejecuta, por lo que el método vuelve inmediatamente y el estado que necesito verificar todavía no está listo.
Puedo establecer una bandera al finalizar sin modificar el SUT, pero eso significaría que tendría que seguir revisando la bandera en un bucle while, por ejemplo, quizás con tiempo de espera.
¿Cuáles son mis opciones?
¿Su objeto presenta algún tipo de señal de que el método asíncrono ha finalizado, como un evento? Si ese es el caso, puede utilizar el siguiente enfoque:
[Test]
public void CanTestAsync()
{
MyObject instance = new MyObject()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Finished" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
instance.AsyncMethodFinished += eventHandler;
// call the async method
instance.CallAsyncMethod();
// Wait until the event handler is invoked
if (!waitHandle.WaitOne(5000, false))
{
Assert.Fail("Test timed out.");
}
instance.AsyncMethodFinished -= eventHandler;
Assert.AreEqual("expected", instance.ValueToCheck);
}
Echa un vistazo a mi artículo sobre las pruebas de unidad de aplicaciones Silverlight
http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx
Hay un ejemplo de prueba unitaria de un método que llama a un servicio WCF de forma asíncrona ...
Mi método preferido es simular e inyectar el mecanismo de enhebrado real para que bajo prueba no sea asíncrono. Algunas veces eso no es posible (si el subproceso del método es parte del marco, o no está bajo su control).
Si no puede controlar la creación de subprocesos, entonces espere a que el subproceso termine de alguna manera, ya sea un bucle de tiempo o simplemente una espera temporizada por el tiempo que se supone que el subproceso debe durar y falla la prueba si el estado no está allí ya que tomó demasiado tiempo de todos modos
Solo pensé que querría una actualización sobre esto ya que la respuesta # 1 en realidad está recomendando un patrón anterior para resolver este problema.
En .net 4.5 + xUnit 1.9 o superior, simplemente puede devolver una Tarea y, opcionalmente, usar la palabra clave asíncrona de su prueba para que xunit espere a que la prueba se complete de forma asíncrona.
Ver este artículo en xUnit.net 1.9
[Fact]
public async Task MyAsyncUnitTest()
{
// ... setup code here ...
var result = await CallMyAsyncApi(...);
// ... assertions here ...
}