Como teste de unidade DelegateCommand que chama métodos assíncronos no MVVM
Eu sou novo no MVVM de Testes Unitários e usando o PRISM no meu projeto. Estou implementando o Unit Testing em nosso projeto atual e não tendo sorte em encontrar recursos on-line que me diriam como o DelegateCommand totest chama o método assíncrono. Esta é uma pergunta de acompanhamento para o meu post -Como Unit Testar um ViewModel com o método assíncrono. sobre como testar um método assíncrono no MVVM e foi respondido que os métodos públicos podem ser testados usando o método assíncrono TestMethod. Esse cenário funcionará somente se o método que eu quero testar for métodos públicos.
O problema é que eu quero testar o meu DelegateCommand como este são os únicos detalhes públicos que eu quero expor em outras classes e tudo o mais é privado. Eu posso expor meus métodos privados como públicos, mas nunca farei isso como um design ruim. Não tenho certeza sobre como fazer isso - O DelegateCommand precisa ser testado ou há algum outro trabalho em torno disso? Estou interessado em saber como os outros fazem isso e de alguma forma me levam ao caminho certo.
Aqui estão os meus códigos novamente
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
}
}
}
também aqui está o comando na minha VM que chama o método assíncrono acima
this.GetTasksCommand = new DelegateCommand(this.GetTasks);
void GetTasks()
{
GetTasksAsync();
}
e agora meu método de teste é como
[TestMethod]
public void Command_Test_GetTasksCommand()
{
MyViewModel.GetTaskCommand.Execute(); // this should populate ViewModel.SimpleTask
Assert.IsTrue(MyBiewModel.SimpleTask != null)
}
Atualmente, o que estou recebendo é que meu ViewModel.SimpleTask = null é porque ele não espera que o método assíncrono seja concluído.