Quiero probar usando xunit una función que ejecuta una tarea y agrega esa tarea. Por ejemplo:
public void doSomething(){ Task.Run(() => { throw new ArgumentNullException(); }); }Cuando quiero probar esta función haciendo esto:
[Fact] public void TestIfTheMethodThrow() { Assert.Throws<ArgumentNullException>(() => doSomething()); // should return true but return false }Quiero que Task.Run() termine por completo, luego se puede hacer la afirmación. Alguien tiene una solución ?
Generar y manejar excepciones usando TPL (la biblioteca de Tareas) es ligeramente diferente al manejo de excepciones "estándar". Tiene sentido evaluar solo una tarea completada, por lo que debe esperar a que se complete, incluso si en este caso es una excepción.
Eche un vistazo a este artículo de MSDN Manejo de excepciones (Biblioteca paralela de tareas) .
Tienes dos opciones diferentes:
agregue .Wait() a Task.Run(...)`
Task.Run(() => { throw new ArgumentNullException(); }).Wait(); o espere mientras se completa la tarea while(!task.IsCompleted) {}
var task = Task.Run(() => { throw new ArgumentNullException(); }); while(!task.IsCompleted) {}El resultado de la prueba debería ser el esperado: se lanza una excepción.
Puede ser que antes de la Wait , su prueba haya pasado esporádicamente, no se irrite, en este caso, la ejecución de la tarea fue más rápida que la verificación de la prueba, esta es una fuente peligrosa de errores sutiles.
Puede escribir su método usando async y await
Lea esto como referencia Programación asíncrona con asíncrono y espera
El nuevo método se ve así, y la persona que llama decidirá si quiere esperar o no, si llama con await , esperará a que se complete la tarea, de lo contrario, continuará sin esperar a que se complete la tarea.
public async Task DoSomethingAsync() { if (true) throw new ArgumentNullException(); await FooAsync(); }En la prueba:
[Fact] public async Task TestIfTheMethodThrow() { await Assert.ThrowsAsync<ArgumentNullException>(() => DoSomethingAsync()); }