【问题标题】:Moq ReturnsAsync() with no parameters无参数的起订量 ReturnsAsync()
【发布时间】:2015-02-02 08:59:11
【问题描述】:

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

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

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    尝试执行以下操作:

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

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

    ReturnsAsync 用于异步返回值。当您只返回 Task 时,实际上根本没有返回任何异步值,因此 ReturnsAsync 在这里并不真正“适合”。

    如果这不能满足您的需求,很遗憾,您将不得不使用Task.FromResult()。据我所知,这确实是创建“已完成”任务的唯一方法 - 除了 new Task(() => {}) 之外(虽然这并不是真正完成的任务,而不是在等待时立即完成的任务) new Task(() => {}) 导致死锁。使用Task.Run(() => {})

    【讨论】:

    • 实际上,等待new Task(() => {}) 会导致死锁,因为该任务尚未启动,也永远不会启动。 Task.Run(() => {}) 会工作。话虽如此,在使用 .NET 4.5 时,我仍然更喜欢 Task.FromResult
    • 我发现的另一种选择是使用 .Returns(Task.Delay(1))。它也适用于我。
    • 它似乎也适用于Task.FromResult<object>(null)
    猜你喜欢
    • 2015-10-10
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2011-02-27
    • 2016-07-02
    相关资源
    最近更新 更多