J'ai une méthode qui ressemble à ceci :
private async void DoStuff(long idToLookUp)
{
IOrder order = await orderService.LookUpIdAsync(idToLookUp);
// Close the search
IsSearchShowing = false;
}
//Other stuff in case you want to see it
public DelegateCommand<long> DoLookupCommand{ get; set; }
ViewModel()
{
DoLookupCommand= new DelegateCommand<long>(DoStuff);
}
J'essaie de le tester de la manière suivante :
[TestMethod]
public void TestDoStuff()
{
//+ Arrange
myViewModel.IsSearchShowing = true;
// container is my Unity container and it setup in the init method.
container.Resolve<IOrderService>().Returns(orderService);
orderService = Substitute.For<IOrderService>();
orderService.LookUpIdAsync(Arg.Any<long>())
.Returns(new Task<IOrder>(() => null));
//+ Act
myViewModel.DoLookupCommand.Execute(0);
//+ Assert
myViewModel.IsSearchShowing.Should().BeFalse();
}
Mon assert est appelé avant que j'aie terminé le LookUpIdAsync simulé. Dans mon code normal, c'est exactement ce que je veux. Mais pour mon test d'unité, je ne veux pas cela.
Je suis en train de passer de l'utilisation de BackgroundWorker à Async/Await. Avec le BackgroundWorker, cela fonctionnait correctement car je pouvais attendre que le BackgroundWorker se termine.
Mais il ne semble pas y avoir de moyen d'attendre une méthode async void...
Comment puis-je tester cette méthode à l'unité ?