模拟异步任务

时间:2014-02-20 08:56:36

标签: c# .net moq

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

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

uploadHelper.Setup().Returns(mockTask);

Task.WaitAll(mockTask);

我面临的问题是Task.WaitAll(mockTask)只是阻塞而且永远不会返回。

我在这里做错了什么?

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

3 个答案:

答案 0 :(得分:15)

您的任务尚未开始!

只需使用:

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

或者,这也有效:

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

答案 1 :(得分:3)

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

如果您真的想要捕获经过测试的代码的异步性质,则不得将Returns方法与值一起使用。

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

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

通过这种方式,您可以确保执行异步执行路径。

答案 2 :(得分:-1)

我用

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