当前位置: 首页 > 编程语言 > C#

单元测试system.timers.timer分享

时间:2023-04-10 17:59:01 C#

单元测试system.timers.timer一直在看关于定时器和线程单元测试的问题。我发现了关于单元测试system.threading.timers的问题,但我需要对system.timers.timer和包装类进行单元测试,这对于这个问题来说似乎不太顺利。我只需要知道如何模拟计时器和/或系统时间,以便我可以对其进行单元测试。我似乎无法在谷歌上的任何地方找到这个。编辑和更新:有意义的是,如果我通过像下面这样包装它来提取计时器,我可以生成一个计时器并使用模拟将其替换为不同的计时器。然后,相关部分将采用我在运行时注入的计时器(原始的,而不是模拟的)并测试事件代码是否已经过去。是什么阻止你包装这个?publicinterfaceITimer{voidStart(doubleinterval);无效停止();事件ElapsedEventHandlerElapsed;这几乎是你所有的接口需求。让我们看看它是如何工作的(请注意,您当然可以公开更多Timer属性,但这对于非常基本的东西应该足够了):publicvoidStart(doubleinterval){timer.Interval=interval;定时器。开始();}publicvoidStop(){timer.Stop();}公共事件ElapsedEventHandlerElapsed{添加{this.timer.Elapsed+=value;}移除{this.timer.Elapsed-=value;现在,您将如何在测试中使用它(假设我们使用FakeItEasy作为选择的模拟框架):vartimerFake=A.Fake();varclassUnderTest=newMyClass(timerFake);//告诉假对象现在引发事件timerFake.Elapsed+=Raise.With(ElapsedEventArgs.Empty).Now;//断言应该发生的事件作为事件响应,确实如此Assert.That(classUnderTest.ReceivedEvent,Is.True);上面的示例实际上测试了触发计时器事件后发生的代码。考虑MyClass看起来像这样:publicclassMyClass{privateITimertimer;publicMyClass(ITimertimer){this.timer=timer;this.timer.Elapsed+=TimerElapsedHandler;}publicboolReceivedEvent{得到;放;}privatevoidTimerElapsedHandler(objectsender,ElapsedEventArgse){ReceivedEvent=true;在我们强制计时器在需要时触发的测试中,我们通过声明ReceivedEvent属性集来检查TimerElapsedHandler代码是否已执行。实际上,这种方法可能做得更多,但它只是改变了我们进行断言的方式——想法保持不变。编辑:您也可以尝试Moles,这个框架允许您生成任何框架类型/方法的假货。但是,如果您想要的是模拟计时器,我会采用包装器方法。您是否需要测试计时器或测试每个事件中执行的代码?如果是这样,您可以将该逻辑放在另一个类中并进行测试。相信定时器会调用它...以上就是C#学习教程:单元测试系统分享的全部内容。定时器。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: