我使用Microsoft BCL在.NET 4.0上使用Moq进行单元测试时出现以下情况
Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass());
uploadHelper.Setup().Returns(mockTask);
Task.WaitAll(mockTask);
Run Code Online (Sandbox Code Playgroud)
我面临的问题是Task.WaitAll(mockTask)只是阻塞而且永远不会返回.
我在这做错了什么?
编辑 请注意,mockTask在我的上下文中是异步的.
Oli*_*ier 15
你的任务没有开始!
只需使用:
Task<MyClass> mockTask = Task.FromResult(new MyClass());
Run Code Online (Sandbox Code Playgroud)
或者,这也适用:
Task<MyClass> mockTask = new Task<MyClass>(() => new MyClass());
mockTask.Start();
Run Code Online (Sandbox Code Playgroud)
所提出的解决方案有一个问题——任务可能在被Returns调用时就已经结束了。这意味着您的单元测试表现出与真实代码不同的异步语义。那是你要的吗?
如果您确实想捕获测试代码的异步性质,则不得使用Returns带有值的方法。
而是使用接受函数的 Returns 重载。像这样的东西:
uploadHelper.Setup().Returns(() => Task.Run(() => new MyClass()));
Run Code Online (Sandbox Code Playgroud)
这样您就可以确定使用异步执行路径。