【问题标题】:Await a task that was started in another method等待以另一种方法启动的任务
【发布时间】: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


【解决方案1】:

你不应该有一个 void 返回 async 方法,除非它是一个事件处理程序(在这种情况下你别无选择)。当 async 方法为 void 时,您无法知道它何时结束。

该方法应返回Task(如果没有有意义的结果,则不应返回Task&lt;T&gt;,只是表明它完成了)。

一旦它返回Task,您可以在测试它时使用await,或者在合适的情况下使用Wait

您正在等待该方法所依赖的任务之一,但这并不意味着它已经完成了它自己的代码。这意味着您的测试引入了竞争条件。

【讨论】:

    【解决方案2】:

    这个调用await myViewModel.DoStuff(); 会在 await 关键字被命中后立即返回(除非它很快完成)。另外,正如 Slaks 提到的,您不能等待 void 返回方法。

    那你就等着var lookupTask = Task&lt;IOrderableTest&gt;.Factory.StartNew(() =&gt; validOrder); 除了返回 IOrderableTest 之外,这似乎没什么用。

    另外,我认为你不应该这样做 await lookupTask,这将再次返回给调用者,在这种情况下,TestRunner 不会/可能不会期望这个。

    您应该改用lookupTask.Wait()(这是一个阻塞调用);并确保完成myViewModel.DoStuff(); 也需要足够的时间。

    总结

    private async Task DoStuff(long idToLookUp)
    {
        IOrder order = await orderService.LookUpIdAsync(idToLookUp);   
    
        OtherStuff = false;
        return;
    }
    

    ....

     var task = myViewModel.DoStuff();
     Task.WaitAll(task, lookupTask);
    

    【讨论】:

      猜你喜欢
      • 2020-03-11
      • 1970-01-01
      • 2021-09-27
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多