我有一个我想测试的课程,其中(简化)看起来像这样:
public interface IHttpClient
{
Task<string> GetStringAsync(string url);
}
class Downloader
{
public string content = "";
public void Download(IHttpClient client)
{
client.GetStringAsync("http://someurl").ContinueWith((t) =>
{
content = t.Result;
});
// Do some other struff async
}
}
关键是,它使用ContinueWith在下载仍在运行时执行某些操作。
我有一个单元测试,如下所示:
[Test]
public async Task TestContinueWith()
{
var httpMock = new Mock<IHttpClient>();
httpMock.Setup(p => p.GetStringAsync("http://someurl")).Returns(
Task.FromResult("SomeContent")
);
Downloader d = new Downloader();
d.Download(httpMock.Object);
Assert.AreEqual("SomeContent", d.content);
}
因内容为“”而失败。 但为什么? FromResult创建一个完成的任务,应该执行ContinueWith吗?
或者,在某些情况发生之前,ContineWith是否会被运行?我该如何解决这个单元测试?