如何对使用 Task.WhenAll 的方法进行单元测试
How to unit test a method that uses Task.WhenAll
假设我们有以下 class:
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();
}
问题是当测试 运行s 时,它不会等待 MethodToBeTested 完成执行,所以输出会有所不同。有什么方法可以使用 NUnit 测试此方法的完整 运行,而不更改方法签名(从 void 到 Task)?
使用GetAwaiter().GetResult()
将确保异步调用运行完成。详细了解 approach vs await here
public void MethodToBeTested()
{
Task.WhenAll(_numberList.Select(async number => { await Task.Run(() => { ProcessNumber(number); }); })).GetAwaiter().GetResult();
}
以防万一有人有任务正在使用网络:
理论上,单元测试不应该有网络调用,因此您不需要 运行 任务。您可以伪造调用 (Task.FromResult(true)),但如果您真的想进行网络调用,请考虑集成测试。
假设我们有以下 class:
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();
}
问题是当测试 运行s 时,它不会等待 MethodToBeTested 完成执行,所以输出会有所不同。有什么方法可以使用 NUnit 测试此方法的完整 运行,而不更改方法签名(从 void 到 Task)?
使用GetAwaiter().GetResult()
将确保异步调用运行完成。详细了解 approach vs await here
public void MethodToBeTested()
{
Task.WhenAll(_numberList.Select(async number => { await Task.Run(() => { ProcessNumber(number); }); })).GetAwaiter().GetResult();
}
以防万一有人有任务正在使用网络:
理论上,单元测试不应该有网络调用,因此您不需要 运行 任务。您可以伪造调用 (Task.FromResult(true)),但如果您真的想进行网络调用,请考虑集成测试。