Como testar a unidade de um método assíncrono / esperar em .NET

O truque é criar uma instância de uma TaskCompleteSourceclasse. Com esta instância, você estará interessado neste método e propriedades:

  • SetResult(...)
  • Task

dado o seguinte método de interface

public Task<IFtpResult> ftpClient.GetDataAsync() { .. }

e, em seguida, dado o seguinte código que executa este método

IFtpResult ftpResult = await ftpClient.GetDataAsync();

isso pode ser ridicularizado como

var fakeResult = new FtpResult(); // Don't forget to create fake data.
var tcs = new TaskCompletionSource<IFtpResult>();
tcsSetResult
(fakeResult);

mockFtpClient

.Setup(x => x.GetDataAsync())
.Returns(tcs.Task);

Portanto, primeiro criamos alguma instância TaskCompletionSource falsa. Nisso dizemos Quando esta tarefa foi concluída, esta é a instância-objeto que gostaria que fosse devolvido.

Então, simplesmente definimos o método mock e o resultado esperado .. que é um Taskque foi falsificado para retornar nosso hardcoded fakeResult.