如何使用异步对流进行单元测试

时间:2021-06-12 08:26:44

标签: c# asynchronous async-await

我有一个流程,它从一个常规函数(方法签名中没有异步)开始,然后我调用 Task.Run(await () => asyncFunction())。

除了等待而不期待任何回报是不好的做法之外,还有什么方法可以运行单元测试来将代码运行到最后? 目前,一旦单元测试完成,需要在 Task.Run 中运行的任务将被取消,因为该任务是异步的并被放置在任务队列的末尾(据我所知),主线程完成并且任务没有机会运行。

谢谢

编辑:添加MVP:

using System;
using System.Threading.Tasks;

namespace SomeNamespace
{
    public class Class1
    {
        public void Foo()
        {
            Task.Run(async () => await AsyncMethod());
        }

        private async Task AsyncMethod()
        {
            await Task.Delay(3000);
            Console.WriteLine("Waited 3 seconds");
        }
    }
}

和单元测试:

[TestMethod]
public void Debug2()
{
    var c = new Class1();
    c.Foo();
}

我希望写入行执行

谢谢

1 个答案:

答案 0 :(得分:3)

<块引用>

除了等待而不期待任何回报是不好的做法之外,还有什么方法可以运行单元测试来将代码运行到最后?

“即发即弃”的一个原因是一种不好的做法,即调用代码无法知道工作何时完成(或是否完成,或者是否完成并出现错误)。

正是同样的原因使测试变得如此困难。您需要注入某种模拟来检测工作的任何副作用,并在测试中忙等待直到观察到副作用。超时对于允许测试失败(而不是挂起)是必要的,并且超时使您的测试本质上是不稳定的。这就是为什么“即发即忘”是一种不好的做法的一个原因。