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

时间:2016-04-29 00:52:27

标签: c# .net visual-studio unit-testing

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

我在每个计时器类的run()方法上运行我的测试,并声明endTime - startTime在我设置计时器的时间的1秒内。

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

我的单位测试在比每个计时器设置的时间更短的时间内传递。

这怎么可能?

EG。休息设定为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 ();
    }

1 个答案:

答案 0 :(得分:6)

基本问题是:

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

您希望为TotalMilliseconds而不是MillisecondsMilliseconds的{​​{1}}组件 - 在这种情况下为0)休眠。

也就是说,更广泛地说,你只是不想对调用TimeSpan的方法进行单元测试,尤其是不测试调用的持续时间。那个测试需要很长时间,是脆弱的和近似的;您在单元测试中绝对要避免的3个属性。要使此代码可测试,您需要在某个接口后面调用Thread.Sleep,然后在单元测试中模拟(请参阅依赖注入)。然后你的单元测试可以验证传递给Sleep()的值是你所期望的,并且如果没有测试真正调用Thread.Sleep的所有问题都会导致这个问题,你就会发现这个bug。