Dou*_*ark 3 .net c# unit-testing visual-studio
我的程序是一个简单的计时器(它是一个番茄钟计时器).我正在尝试将单元测试纳入我的个人项目中.
我在每个计时器类的run()方法上运行我的测试,并声明endTime - startTime在我设置计时器的时间的1秒内.
MyTimer.run()调用Thread.sleep(timerMilliseconds).
我的单元测试通过的时间比每个计时器设置的时间短.
这怎么可能?
例如.休息设置为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 ();
}
Run Code Online (Sandbox Code Playgroud)
基本问题是:
public override void run () {
Thread.Sleep(base.getTimer().Milliseconds);
}
Run Code Online (Sandbox Code Playgroud)
你想要睡觉TotalMilliseconds
,而不是Milliseconds
(在这种情况下为-0 的Milliseconds
组成部分TimeSpan
).
也就是说,更广泛地说,你只是不想对一个调用方法进行单元测试Thread.Sleep
,尤其是不测试调用的持续时间.这个测试需要很长时间,是脆弱的和近似的; 您在单元测试中绝对要避免的3个属性.要使此代码可测试,您需要将调用抽象为Thread.Sleep
一些接口,然后您可以在单元测试中进行模拟(请参阅依赖注入).然后,您的单元测试可以验证传递给Sleep()的值是您所期望的,并且如果没有测试真实调用的所有问题Thread.Sleep
都会导致您发现此错误.
归档时间: |
|
查看次数: |
320 次 |
最近记录: |