【发布时间】:2013-01-11 06:15:38
【问题描述】:
在继续我的单元测试的其余部分之前,我需要确保完成一项任务。
但这是在另一个方法中等待的任务(我正在对该方法进行单元测试。)
我尝试过等待任务或调用 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。
【问题讨论】:
-
不要创建
async voids;你等不及他们了。 -
@SLaks - 唉,很多事情都需要 void 方法签名。 (命令就是其中之一。我想我可以为每个命令调用提供两种方法,但看起来很乱。)
-
@Vaccano 在这种情况下,您应该非常小心。因为大多数时候这意味着
async无法处理这些东西。很少使用async void正确的解决方案。
标签: c# .net unit-testing async-await