我有一个接口声明
Task DoSomethingAsync();
我使用 Moq 框架进行测试:
[TestMethod()]
public async Task MyAsyncTest()
{
Mock<ISomeInterface> mock = new Mock<ISomeInterface>();
mock.Setup(arg => arg.DoSomethingAsync()).Callback(() => { <my code here> });
...
}
然后在我的测试中我执行调用的代码await DoSomethingAsync()
。测试就在那条线上失败了。我究竟做错了什么?
您的方法没有任何回调,因此没有理由使用.CallBack()
。您可以使用以下命令简单地返回具有所需值的任务.Returns()
and 任务.FromResult, e.g.:
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>
。对于仅返回任务的方法,
.Returns(Task.FromResult(default(object)))
可以使用。
如图所示这个答案,在 .NET 4.6 中这被简化为.Returns(Task.CompletedTask);
, e.g.:
mock.Setup(arg=>arg.DoSomethingAsync())
.Returns(Task.CompletedTask);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)