Moq使用没有参数的ReturnsAsync()

时间:2014-12-04 13:00:55

标签: c# unit-testing moq

我使用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()的参数。

1 个答案:

答案 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(() => {})