studio programacion móviles metodos ejemplos desarrollo curso asincronos aplicaciones .net unit-testing xunit.net nmock

.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); }



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 ... }