单元测试System.Timers.Timer的(unit testing system.timers.timer)

   IT问题网   2018-01-10 00:00:00

问 题

我一直在阅读了单元测试与定时器和线程的问题。我发现单元测试system.threading.timers的so问题,但我需要单元测试system.timers.timer的和包装类似乎并不很顺利地为这一个工作。

我只需要知道如何模拟定时器和/或系统时间,以反对单元测试。我似乎无法找到这个任何地方对谷歌。

编辑和放大器;更新: 这是有道理的,如果我提取定时通过包装它下面,我可以生成一个计时器,并用嘲讽把它与一个不同的定时器代替。相关的部分,然后把我正在注入在运行时(原始的,而不是模拟)的定时器和测试它的过去事件code。

解决方案

从什么包装这个阻止你?

 公共接口itimer的
{
无效启动(双间隔);
无效停止();
事件elapsedeventhandler消逝;
}
 

这是pretty的多所有的接口需求。让我们来看看这到底是怎么走(注意,你可以肯定会将更多的定时器属性,但是这是pretty的很多基本的东西,应该是足够了):

 公共类mytimer:itimer的
{
私人定时器定时=新的timer();

公共无效启动(双间隔)
{
timer.interval =区间;
timer.start();
}

公共无效停止()
{
timer.stop();
}

公共事件elapsedeventhandler消逝
{
添加{this.timer.elapsed + =价值; }
除去{this.timer.elapsed-=价值; }
}
}
 

现在,你将如何在您的测试应用(假设我们使用 fakeiteasy 的嘲讽框架的选择):

var timerfake = a.fake itimer的();
var classundertest =新myclass的(timerfake);

//告诉假冒的对象现在提高事件
timerfake.elapsed + = raise.with elapsedeventargs(elapsedeventargs.empty)。现在,

//断言什么是应该发生的事件响应,确实做了
assert.that(classundertest.receivedevent,is.true);
 

以上示例实际上确实测试code出现这种情况的一旦计时器事件引发。考虑 myclass的寻找这样的:

 公共类myclass的
{
私人itimer的定时器;

公共myclass的(itimer的定时器)
{
this.timer =定时器;
this.timer.elapsed + = timerelapsedhandler;
}

公共bool receivedevent {获得;组; }

私人无效timerelapsedhandler(对象发件人,elapsedeventargs e)
{
receivedevent = true;
}
}
 

在测试中,我们的动力的计时器,以提高当我们需要它,我们检查 timerelapsedhandlercode是否执行,由断言 receivedevent 属性设置。在现实中,这种方法可能会做更多的事,但只会改变我们断言的方式 - 的想法是一样的。


编辑:您也可以尝试,一个框架,允许你生成的的假货任何框架类型/方法的。但是,如果嘲讽定时器是你想要的,我会去与包装方法。

标签:单元测试



分享:

  • 微信
  • QQ好友
  • QQ空间
  • 新浪微博


热门推荐

为什么String.IsNullOrEmpty比string.length减得快?(Why is String.IsNullOrEmpty faster than String.Length)

problem ilspy shows that string.isnullorempty is implemen ...

ASP.NET例外"正在中止线程"导致方法退出(ASP.NET exception "Thread was being aborted" causes method to exit)

problem in the code below, sometimes somefunc ...

如何通过在磁盘上真正大文件扫描?(How to scan through really huge files on disk)

problem considering a really huge file(maybe more than 4g ...

字符串和垃圾收集(Strings and Garbage Collection)

problem i have heard conflicting stories on this topic an ...

在C#中如何蚕食(半字节)字节?(How can you nibble (nybble) bytes in C#)

problem i am looking to learn how to get two ...

ASP.NET网站内存使用率相当高(ASP.NET Website Memory Usage quite high)

problem i have an asp.net website that will h ...

在.NET 4.0中,什么是对的Equals值类型的默认实现?(In .NET 4.0, What is the default implementation of Equals for value types)

problem the two documentation pages seem to contradict on ...

如何确定文件是否在.NET中的图像文件?(How can I determine if a file is an image file in .NET)

problem i don't want to rely on the file exte ...

关于反映在.NET一个很好的和完整的教程?(A good and complete tutorial about reflection in .NET)

problem the question almost says it all. i th ...

如何签署ClickOnce应用程序(How to sign a ClickOnce application)

problem i have a clickonce application that i ...

防爆pression的类型成员产生不同的防爆pressions(MemberEx pression,UnaryEx pression)(Expression for Type members results in different Expressions (MemberExpression, UnaryExpression))

problem i have a expression to point on a property of m ...

流包装,使流可查找?(Stream wrapper to make Stream seekable)

problem i have a readonly system.io.stream implementation ...

如何检查,如果用户是在与MVC4简单的会员了一些不同的角色,任何一个?(How can I check if a user is in any one of a few different roles with MVC4 Simple membership)

problem i understand that a good way to check if an user ...

找到了DBUpdateException的原因(Finding the reason for DBUpdateException)

problem when calling dbcontext.savechanges, i get a dbupd ...

Task.Run在静态初始化(Task.Run in Static Initializer)

problem consider the following code. static class x { pu ...

是否有可能使自定义传输信道的WcfTestClient工作?(Is it possible to make the WcfTestClient work for custom transport channels)

problem i would like to be able to both host and connec ...

如何生成的xs:日期在WCF OperationContract的参数(How to generate xs:Date in WCF OperationContract parameter)

problem for parameters to an operationcontract that repre ...

WPF - 我怎样才能使一个刷子绘制图的纸状的广场?(WPF - How can I make a brush that paints graph-paper-like squares)

problem how might i create a brush that paints a regular, ...

做NGEN后,我在哪里可以找到生成的文件的位置?(Where can I find location of generated file after doing Ngen)

problem i did ngen on a c# executable. it was succesful, ...

进口功能无法为组合的功能创建(Function imports cannot be created for composable functions)

problem i have generated entity codeblock for my database ...