我创建了虚拟代码来描述我的问题如下:
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这种逻辑吗?
答案 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
的构造函数而不是方法。