我在使用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在我的上下文中是异步的。
答案 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());