我有一个接口声明
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()。测试只是失败了。我究竟做错了什么?
await DoSomethingAsync()
您的方法没有任何回调,因此没有理由使用.CallBack()。您可以使用.Returns()和Task.FromResult简单地返回具有所需值的Task,例如:
.CallBack()
.Returns()
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的方法,
ReturnsAsync
Task<T>
.Returns(Task.FromResult(default(object)))
可以使用。
如此答案所示,在.NET 4.6中,它简化为.Returns(Task.CompletedTask);:
.Returns(Task.CompletedTask);
mock.Setup(arg=>arg.DoSomethingAsync()) .Returns(Task.CompletedTask);