Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 模拟异步任务_C#_.net_Moq - Fatal编程技术网

C# 模拟异步任务

C# 模拟异步任务,c#,.net,moq,C#,.net,Moq,在使用Microsoft BCL在.NET 4.0上使用Moq进行单元测试时,我遇到了以下情况 Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass()); uploadHelper.Setup().Returns(mockTask); Task.WaitAll(mockTask); Task mockTask=newtask(()=>newmyclass()); uploadHelper.S

在使用Microsoft BCL在.NET 4.0上使用Moq进行单元测试时,我遇到了以下情况

Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass());

uploadHelper.Setup().Returns(mockTask);

Task.WaitAll(mockTask);
Task mockTask=newtask(()=>newmyclass());
uploadHelper.Setup()返回(mockTask);
Task.WaitAll(mockTask);
我面临的问题是Task.WaitAll(mockTask)只是阻塞,永远不会返回

我做错了什么

编辑
请注意,mockTask在我的上下文中是异步的。

您的任务未启动

只需使用:

 Task<MyClass> mockTask = Task.FromResult(new MyClass());
Task mockTask=Task.FromResult(新的MyClass());
或者,这也适用于:

Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass());
mockTask.Start();
Task mockTask=newtask(()=>newmyclass());
mockTask.Start();
我使用

Task.Factory.StartNew(() => new MyClass());

建议的解决方案有一个问题-任务可能在调用
Returns
时结束。 这意味着您的单元测试显示出与实际代码不同的异步语义。这就是你想要的吗

如果您确实希望捕获测试代码的异步性质,则不能使用带有值的
返回方法

而是使用接受函数的返回重载。大概是这样的:

uploadHelper.Setup().Returns(() => Task.Run(() => new MyClass()));

这样,您就可以确定执行异步执行路径。

我必须使用TaskEx.FromResult,因为我在.Net 4.0上。另一种方法是“不能在承诺式任务上调用Start”,因为它是异步任务。我没有在我的帖子中提到它。我已经更新了我的postTask.FromResult是一个更好的选项,因为它不会启动新线程。为任务调用构造函数将安排线程在线程池上运行,这将花费更长的时间。虽然这是一个测试,性能也不是什么大问题,但是如果您有许多异步方法要测试,那么您应该尽量避免这样做。此外,它是声明性的,这有助于提高可读性。