一尘不染

如何告诉Moq返回任务?

c#

我有一个接口声明

Task DoSomethingAsync();

我正在使用MoqFramework进行测试:

[TestMethod()]
public async Task MyAsyncTest()
{
   Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
   mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
   ...
}

然后在测试中,我执行调用的代码await DoSomethingAsync()。测试只是失败了。我究竟做错了什么?


阅读 378

收藏
2020-05-19

共1个答案

一尘不染

您的方法没有任何回调,因此没有理由使用.CallBack()。您可以使用.Returns()Task.FromResult简单地返回具有所需值的Task,例如:

MyType someValue=...;
mock.Setup(arg=>arg.DoSomethingAsync())        
    .Returns(Task.FromResult(someValue));

更新2014-06-22

Moq 4.2有两种新的扩展方法可以帮助实现这一点。

mock.Setup(arg=>arg.DoSomethingAsync())
    .ReturnsAsync(someValue);

mock.Setup(arg=>arg.DoSomethingAsync())        
    .ThrowsAsync(new InvalidOperationException());

更新2016-05-05

正如Seth
Flowers在另一个答案中提到的那样,ReturnsAsync仅适用于返回a的方法Task<T>。对于仅返回Task的方法,

.Returns(Task.FromResult(default(object)))

可以使用。

如此答案所示,在.NET
4.6中,它简化为.Returns(Task.CompletedTask);

mock.Setup(arg=>arg.DoSomethingAsync())        
    .Returns(Task.CompletedTask);
2020-05-19