C# Moq ReturnsAsync()不带参数
我用最小起订量。我模拟了一个具有如下方法的类:C# Moq ReturnsAsync()不带参数,c#,unit-testing,moq,C#,Unit Testing,Moq,我用最小起订量。我模拟了一个具有如下方法的类: public async Task DoSomething() { // do something... } someMock.Setup(x => x.DoSomething()) .Callback(() => {}) .Returns(Task.CompletedTask); 我的设置如下所示: SomeMock.Setup(x => x.DoSomething())
public async Task DoSomething()
{
// do something...
}
someMock.Setup(x => x.DoSomething())
.Callback(() => {})
.Returns(Task.CompletedTask);
我的设置如下所示:
SomeMock.Setup(x => x.DoSomething())
.Callback(() => ... ))
.Returns(Task.FromResult(default(int)));
我不喜欢最后一行:
。返回(Task.FromResult(默认值(int))
。有没有一种方法可以更优雅地设置异步返回。我知道有一个方法ReturnsAsync()
,但它有一个参数。我的方法只返回任务
,因此我没有ReturnsAsync()的参数
请尝试执行以下操作:
public async Task DoSomething()
{
// do something...
}
someMock.Setup(x => x.DoSomething())
.Callback(() => {})
.Returns(Task.CompletedTask);
请注意,Task.CompletedTask
仅存在于.NET4.6(最近发布)或更新版本中。您可以在StackOverflow答案中找到更多信息
ReturnsAsync
用于异步返回值。当您只返回一个任务时
,实际上根本没有返回任何异步值,因此ReturnsAsync
在这里并不真正“适合”
如果这不符合您的需要,很遗憾,您将不得不使用
Task.FromResult()
。据我所知,这确实是创建“已完成”任务的唯一方法-除了可能的新任务(()=>{})
(虽然这不是真正已完成的任务,但比等待时立即完成的任务更多)新任务(()=>{})
会导致死锁。使用Task.Run(()=>{})
实际上,等待新任务(()=>{})
会导致死锁,因为该任务没有也永远不会启动<代码>任务。运行(()=>{})也可以。尽管如此,在使用.NET4.5时,我仍然更喜欢Task.FromResult
。我发现的另一种选择是使用.Returns(Task.Delay(1))。它也适用于我。它似乎也适用于Task.FromResult(null)
。