Moq 返回不带参数的异步()

本文关键字:异步 参数 返回 Moq | 更新日期: 2023-09-27 18:33:10

我使用最小起订量。我模拟了一个类,它的方法如下所示:

public async Task DoSomething()
{
    // do something...
}

我像下面这样设置它:

SomeMock.Setup(x => x.DoSomething())
                .Callback(() => ... ))
                .Returns(Task.FromResult(default(int)));

我不喜欢最后一行:.Returns(Task.FromResult(default(int))).有没有办法以更优雅的方式设置异步返回。我知道有一个方法ReturnsAsync()但它有一个参数。我的方法只返回Task所以我没有ReturnsAsync()的参数。

Moq 返回不带参数的异步()

尝试执行以下操作:

someMock.Setup(x => x.DoSomething())
   .Callback(() => {})
   .Returns(Task.CompletedTask);

请注意,Task.CompletedTask仅存在于 .NET 4.6(最近发布)或更高版本中。您可以在此StackOverflow答案中找到更多信息。

ReturnsAsync用于异步返回值的情况。当你只返回一个Task时,你实际上根本没有返回任何异步值,所以ReturnsAsync在这里并不真正"适合"。

如果这不符合您的需求,您将不得不使用 Task.FromResult() ,不幸的是。据我所知,这确实是创建"已完成"任务的唯一方法 - 除了可能new Task(() => {})(尽管这不是一个真正完成的任务,而不是一个在等待时立即完成的任务)new Task(() => {})会导致死锁。使用 Task.Run(() => {}) .