如何对使用 Task.WhenAll 的方法进行单元测试

本文关键字:方法 单元测试 WhenAll Task | 更新日期: 2023-09-27 18:32:25

假设我们有以下类:

class SampleClass
{
    private readonly IList<int> _numberList = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    public void MethodToBeTested()
    {
        Task.WhenAll(_numberList.Select(async number => { await Task.Run(() => { ProcessNumber(number); }); }));
    }
    private static void ProcessNumber(int number)
    {
        Console.WriteLine($"Thread: {Thread.CurrentThread.ManagedThreadId} Number:{number}");
        Thread.Sleep(1000);
    }
}

我们添加以下单元测试:

[Test]
public void TestMethodToBeTested()
{
    var sampleClass = new SampleClass();
    _sampleClass.MethodToBeTested();
}

问题在于,当测试运行时,它不会等待 MethodToBeTest 完成执行,因此输出会有所不同。有没有办法使用 NUnit 测试此方法的完整运行,而无需更改方法签名(从 void 到 Task)?

如何对使用 Task.WhenAll 的方法进行单元测试

使用 GetAwaiter().GetResult() 将确保异步调用运行完成。在此处阅读有关该方法与等待的更多信息

public void MethodToBeTested()
{
    Task.WhenAll(_numberList.Select(async number => { await Task.Run(() => { ProcessNumber(number); }); })).GetAwaiter().GetResult();
}

以防万一有人有正在使用网络的任务:

理论上,单元测试不应该有网络调用,因此不需要运行任务。您可以伪造调用(Task.FromResult(true)),但如果您真的想进行网络调用,请考虑集成测试。