在继续我的单元测试的其余部分之前,我需要确保完成一项任务。
但这是在另一个方法中等待的任务(我正在对该方法进行单元测试。)
我已经尝试等待任务或调用 task.Wait() 但每次测试都不起作用。
实际的方法是这样的:
private async void DoStuff(long idToLookUp)
{
IOrder order = await orderService.LookUpIdAsync(idToLookUp);
OtherStuff = false;
}
我正在尝试像这样对其进行单元测试:
[TestMethod]
public void TestDoStuff()
{
//+ Arrange
var lookupTask = Task<IOrderableTest>.Factory.StartNew(() => validOrder);
orderService.LookUpIdAsync(Arg.Any<long>()).Returns(lookupTask);
//+ Act
myViewModel.DoStuff();
await lookupTask;
//+ Assert
myViewModel.OtherStuff.Should().BeFalse();
}
失败的方式非常无益。在它导致另一个测试失败并显示“代理进程在测试运行时停止”。 (据我所知,这意味着后台线程在测试运行时抛出了异常。)
所以我想知道如何让我的代码等待单元测试完成。
我看到了this答案似乎还不错。但它更适合方法的调用。我不是在调用它,我只是有任务而已。
注意:我的目标是使用 ansyc 包的 .NET 4.0。
最佳答案
你永远不应该有 void
返回 async
方法,除非它将成为一个事件处理程序(在这种情况下你别无选择)。当 async
方法是 void
你无法知道它何时结束。
该方法应返回 Task
(而不是 Task<T>
如果它没有有意义的结果,只是表明它完成了)。
一旦返回 Task
你可以await
测试时使用它,或使用 Wait
,如果合适的话。
您正在等待该方法所依赖的任务之一,但这并不意味着它已经完成了它自己的代码。这意味着您的测试引入了竞争条件。
关于c# - 等待以另一种方法启动的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14267962/