Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Moq ReturnsAsync()不带参数_C#_Unit Testing_Moq - Fatal编程技术网

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)