我使用Moq。我已经模拟了一个类似于以下方法的类:
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()
的参数。
答案 0 :(得分:15)
尝试执行以下操作:
someMock.Setup(x => x.DoSomething())
.Callback(() => {})
.Returns(Task.CompletedTask);
请注意,Task.CompletedTask
仅存在于.NET 4.6(最近发布)或更新版本中。您可以在this StackOverflow答案中找到更多信息。
ReturnsAsync
用于异步返回值。当您只返回Task
时,您实际上根本没有返回任何异步值,因此ReturnsAsync
并不适合{#1}}。这里。
如果这不符合您的需求,那么您将不得不使用Task.FromResult()
。据我所知,这是创造一个完整的'任务 - 除了 new Task(() => {})
之外(虽然这不是一个真正完成的任务,不仅仅是等待时立即完成的任务)new Task(() => {})
会导致死锁。使用Task.Run(() => {})
。