【发布时间】:2017-09-22 08:37:33
【问题描述】:
我创建了虚拟代码来描述我的问题,如下所示:
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 的最佳方法是什么?逻辑?
【问题讨论】:
-
你的
GetItems方法应该被等待(所以它应该返回一个任务)。你的测试也应该如此 (public Task TestGetItmes()) -
您的示例可能失败,但您不能在
GetItems中使用await,因为它不是async -
@Iqon 是的,我看到了,想知道这是否是要走的路......
-
@IronHide 静态框架方法在单元测试中总是存在问题。如果项目足够大,我总是将这些方法包装在帮助服务中。 (IoC 和 DependencyInjection 将使这更容易)。否则,这些方法中的大多数根本无法测试。我的意思是,你可以等待 10 秒,但单元测试应该很快。如果可以mock该方法,就可以将时间减少到零。
标签: c# unit-testing