gpt4 book ai didi

c# - 单元测试在 Thread.Sleep 时间之前完成

转载 作者:行者123 更新时间:2023-11-30 14:25:55 25 4
gpt4 key购买 nike

我的程序是一个简单的计时器(它是一个番茄钟)。我正在尝试将单元测试合并到我的个人项目中。

我对每个计时器类的 run() 方法运行我的测试,并断言 endTime - startTime 在我设置计时器的时长的 1 秒内。

MyTimer.run() 调用 Thread.sleep(timerMilliseconds)。

我的单元测试通过的时间少于每个计时器设置的时间。

这怎么可能?

例如。 Rest 设置为 5 秒,单元测试在 < 1ms 内通过

[TestMethod]
public void testRun () {
TimeSpan fiveSeconds = new TimeSpan(5000);
Rest rest = new Rest(fiveSeconds, null);
TimeSpan startTime = DateTime.Now.TimeOfDay;
try {
rest.run();
}
catch (Exception e) {
Assert.Fail(e.ToString());
}

Assert.AreEqual(startTime.Add(fiveSeconds).TotalMilliseconds, DateTime.Now.TimeOfDay.TotalMilliseconds, 1000 , "Actual sleep time not expected");
}


public class Rest : Session {

private TimeSpan timeSpan;

public override void run () {
Thread.Sleep(base.getTimer().Milliseconds); **//SOLVED: SHOULD READ base.getTimer().TotalMilliseconds**
}

public Rest (TimeSpan timeSpan, Cycle cycle) : base(timeSpan, cycle) {
this.timeSpan = timeSpan;
}
}


public abstract class Session {
private readonly TimeSpan timer;
protected Cycle cycle;

public TimeSpan getTimer () {
return this.Timer;
}

protected Session (TimeSpan minutes, Cycle cycle) {
this.timer = minutes;
this.cycle = cycle;
}

public abstract void run ();
}

最佳答案

基本问题是这样的:

public override void run () {
Thread.Sleep(base.getTimer().Milliseconds);
}

你想睡 TotalMilliseconds , 不是 Milliseconds (TimeSpanMilliseconds 组件 - 在本例中为 0)。

也就是说,更广泛地说,您只是不想对调用 Thread.Sleep 的方法进行单元测试,尤其是不想测试调用的持续时间。该测试将花费很长时间,脆弱且近似;在单元测试中绝对要避免的 3 个属性。要使此代码可测试,您需要将对 Thread.Sleep 的调用抽象化到某个接口(interface)后面,然后您可以在单元测试中对其进行模拟(参见依赖注入(inject))。然后,您的单元测试可以验证传递给 Sleep() 的值是否符合您的预期,并且您可以捕获此错误,而不会出现测试对 Thread.Sleep 的实际调用会导致的所有问题。

关于c# - 单元测试在 Thread.Sleep 时间之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36927807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com