如何使用等待延迟的单元测试方法

时间:2017-09-22 08:37:33

标签: c# unit-testing

我创建了虚拟代码来描述我的问题如下:

  public class ItemGenerator
    {
        public bool isStopped;
        public List<int> list = new List<int>();
        public void GetItems(int itemsPerSecond)
        {
            int i = 0;
            while (!isStopped)
            {
                list.add(i);
                await Task.Delay(1000);
                i++;
            }
        }
    }



    [Test]
    public void TestGetItmes()
    {
        ItemGenerator gen = new ItemGenerator();

        gen.GetItems(1000);

        await  Task.Delay(5000).ContinueWith(t =>
        {
            gen.isStopped = true;
            Assert.True(gen.list.Count() == (5 * 1000));
        });
    }

现在的问题是,断言会偶尔失败,我想它与CPU性能有关,而且不能保证1000的延迟总是1000毫秒但是最好的方法是什么UT这种逻辑吗?

1 个答案:

答案 0 :(得分:1)

以下是我如何做到这一点 - 首先使用内置的CancellationToken

public class ItemGenerator
{
    public List<int> List { get; } = new List<int>();

    public async Task GetItems(CancellationToken token)
    {
        int i = 0;
        while(!token.IsCancellationRequested)
        {
            List.Add(i);
            await Task.Delay(1000);
            i++;
        }
    }
}

然后,您的测试可以使用CancellationTokenSource,特别是CancelAfter方法:

var gen = new ItemGenerator();

CancellationTokenSource src = new CancellationTokenSource();
src.CancelAfter(5000);
await gen.GetItems(src.Token);

请注意,如果更合适,您可以将CancellationToken传递给ItemGenerator的构造函数而不是方法。