C# 模拟异步任务
在使用Microsoft BCL在.NET 4.0上使用Moq进行单元测试时,我遇到了以下情况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
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是一个更好的选项,因为它不会启动新线程。为任务调用构造函数将安排线程在线程池上运行,这将花费更长的时间。虽然这是一个测试,性能也不是什么大问题,但是如果您有许多异步方法要测试,那么您应该尽量避免这样做。此外,它是声明性的,这有助于提高可读性。