模拟异步任务

Chu*_*dad 10 .net c# moq

我使用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)


mar*_*ark 3

所提出的解决方案有一个问题——任务可能在被Returns调用时就已经结束了。这意味着您的单元测试表现出与真实代码不同的异步语义。那是你要的吗?

如果您确实想捕获测试代码的异步性质,则不得使用Returns带有值的方法。

而是使用接受函数的 Returns 重载。像这样的东西:

uploadHelper.Setup().Returns(() => Task.Run(() => new MyClass()));
Run Code Online (Sandbox Code Playgroud)

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