Cómo realizar la prueba unitaria de un modelo ViewModel con método asíncrono.
No estoy seguro de por dónde empezar, pero permítame darle una breve idea de dónde estoy y lo que quiero lograr. Soy bastante nuevo en Unit Testing en MVVM y tengo dificultades para probar los comandos que expuse utilizando las propiedades de comando de delegado de PRISM. Mis comandos de delegado llaman a un método asíncrono que debe esperarse para que pueda obtener el resultado real. A continuación se muestra un método asyc que se llama por el método que quería probar.
async void GetTasksAsync()
{
this.SimpleTasks.Clear();
Func<IList<ISimpleTask>> taskAction = () =>
{
var result = this.dataService.GetTasks();
if (token.IsCancellationRequested)
return null;
return result;
};
IsBusyTreeView = true;
Task<IList<ISimpleTask>> getTasksTask = Task<IList<ISimpleTask>>.Factory.StartNew(taskAction, token);
var l = await getTasksTask; // waits for getTasksTask
if (l != null)
{
foreach (ISimpleTask t in l)
{
this.SimpleTasks.Add(t); // adds to ViewModel.SimpleTask
}
}
}
También aquí está el comando en mi máquina virtual que llama al método asíncrono anterior
this.GetTasksCommand = new DelegateCommand(this.GetTasks);
void GetTasks()
{
GetTasksAsync();
}
y ahora mi método de prueba va como
[TestMethod]
public void Command_Test_GetTasksCommand()
{
MyViewModel.GetTaskCommand.Execute(); // this should populate ViewModel.SimpleTask
Assert.IsTrue(MyBiewModel.SimpleTask != null)
}
Actualmente, lo que estoy obteniendo es que mi ViewModel.SimpleTask = null se debe a que no espera a que finalice el método asíncrono. Entiendo que hay algunos temas relacionados con esto que ya están en el desbordamiento de pila, pero no pude encontrar algo relacionado con mis DelegateCommands.