c# - 等待以另一种方法启动的任务

标签 c# .net unit-testing async-await

在继续我的单元测试的其余部分之前,我需要确保完成一项任务。

但这是在另一个方法中等待的任务(我正在对该方法进行单元测试。)

我已经尝试等待任务或调用 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/

相关文章:

c# - 您可以在非 Windows 平台上编写 C# 应用程序吗?

c# - 从返回结构的 C++ 导入函数

c# - 为什么 Moq 抛出 "expected Invocation on the mock at least once"。在哪里设置一次,即使它被设置为空?

java - 无法在 Spring Boot 测试中加载上下文属性

c# - CreateUserWizard 中的 ActiveStepChanged

c# - C# .NET 中的表单

c# - 我的 Windows 应用商店应用程序在关闭后仍在 Debug模式下运行

c# - 在 asp.net 中使用最小起订量测试服务类

c# - .NET Core 应用程序调试错误 : "Unable to set the next statement. This file does not exactly match the original version."

.net - 如何找到所有依赖的dll