首页 / 知识
关于c#:什么是在测试期间覆盖DateTime.Now的好方法?
2023-04-14 04:50:00
What's a good way to overwrite DateTime.Now during testing?我有一些(C#)代码依赖于今天的日期来正确计算将来的事情。 如果我在测试中使用今天的日期,则必须在测试中重复计算,感觉不对。 在测试中将日期设置为已知值的最佳方法是什么,以便我可以测试结果是否为已知值? 我的首选是让使用时间的类实际上依赖于一个接口,例如
具体实施
然后,如果需要,您可以提供任何其他想要测试的时钟,例如
向依赖它的类提供时钟可能会有一些开销,但是可以通过任何数量的依赖项注入解决方案来处理(使用控制容器反转,普通的旧构造函数/ setter注入,甚至是静态网关模式) )。 交付提供所需时间的对象或方法的其他机制也可以使用,但是我认为关键是要避免重置系统时钟,因为这只会给其他层次带来麻烦。
另外,使用 Ayende Rahien使用一种非常简单的静态方法...
我认为为诸如获取当前日期之类的简单事件创建单独的时钟类有点过头了。 您可以将今天的日期作为参数传递,以便可以在测试中输入其他日期。这具有使代码更灵活的附加好处。 使用Microsoft Fakes创建垫片是一种非常简单的方法。假设我有以下课程:
在Visual Studio 2012中,可以通过右键单击要为其创建Fakes / Shims的程序集并选择"添加Fakes程序集",将Fakes程序集添加到测试项目中。
最后,这是测试类的样子:
成功进行单元测试的关键是去耦。您必须将您感兴趣的代码与其外部依赖项分开,以便可以对其进行单独测试。 (幸运的是,测试驱动开发会产生解耦的代码。) 在这种情况下,您的外部设备是当前的DateTime。 我的建议是将处理DateTime的逻辑提取到新方法或类或您认为合适的任何东西,然后传递DateTime。现在,您的单元测试可以传递任意DateTime,以产生可预测的结果。 另一个使用Microsoft Moles(.NET的隔离框架)。
我建议使用IDisposable模式:
这里详细介绍: 简单的答案:抛弃System.DateTime :)而是使用NodaTime及其测试库:NodaTime.Testing。 进一步阅读:
您可以在测试的类中注入用于
编辑:布莱尔·康拉德(Blair Conrad)说了什么(他有一些代码要看)。除此之外,我倾向于使用委托,因为他们不会用 我经常遇到这种情况,以至于我创建了一个简单的nuget,它通过接口公开了Now属性。
实施当然很简单
因此,在将nuget添加到我的项目中之后,我可以在单元测试中使用它
您可以直接从GUI Nuget软件包管理器或使用以下命令来安装模块:
Nuget的代码在这里。 可在此处找到Autofac用法的示例。 您是否考虑过使用条件编译来控制调试/部署期间发生的情况? 例如
否则,您想公开该属性以便可以对其进行操作,这是编写可测试代码的全部挑战,这是我目前正在努力解决的问题:D 编辑 我很大一部分会喜欢布莱尔的方法。这使您可以"热插拔"部分代码以帮助测试。一切都遵循设计原理封装各种测试代码与生产代码没有什么不同,只是没有人从外部看到过它。 对于本示例,创建和接口似乎需要很多工作(这就是为什么我选择条件编译的原因)。 |
最新内容
相关内容
linux的数学计算命令?
linux的数学计算命令?,工作,系统,信息,地址,数字,目录,命令,百分比,情况,管理,linux的shell脚本编程,求两数字间所有偶数的和,我是小白,不太懂linux命令日期修改?
linux命令日期修改?,时间,系统,电脑,信息,命令,标准,文件,终端,日期,时分,LINUX系统如何修改时间命令?1、打开linux系统,在linux的桌面的空白处linux云计算查看命令?
linux云计算查看命令?,系统,信息,地址,工作,命令,情况,标准,服务,软件,网络,linux常用命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出linux打开计算器命令?
linux打开计算器命令?,密码,电脑,工作,设备,数字,系统,手机,指数,情况,服务,关于Linux的(操作过程中的Linux命令必须完整给出)对Linux操作系统linux切换日期命令?
linux切换日期命令?,时间,系统,信息,命令,城市,终端,时分,日期,窗口,操作系统,linux修改系统时间命令首先输入date的时候,系统输出的是linux的linux设置日期命令?
linux设置日期命令?,时间,系统,标准,命令,信息,大陆,国家,日期,时钟,时区,详解Linux系统中的日期设定与date命令的用法1、date 命令用于 显示linux命令输出计算?
linux命令输出计算?,标准,地址,工作,信息,系统,命令,软件,数据,文件,控制台,linux借用外部命令expr,实现计算器功能,利用管道,进程1、你得装一linux拷贝覆盖命令?
linux拷贝覆盖命令?,系统,文件,信息,命令,目录,时间,基本知识,项目,数据,源文件,Linux下如何使用cp命令复制文件及复制目录1、处在当前目录复linux修改日期命令?
linux修改日期命令?,时间,系统,命令,信息,工具,工作,服务,代码,日期,终端,linux怎么通过date修改日期1、输入“date +Today is =%x time is =%linux计算总数命令?
linux计算总数命令?,系统,第一,情况,数据,信息,电脑,命令,百分比,单位,工作,linux下如何统计一个目录下的文件个数以及代码总行数的命令1、在Llinux中计算器命令?
linux中计算器命令?,地址,数据,位置,网络,设备,时间,环境,平台,软件,命令,说说常用的UNIX命令?命令:whoami格式:whoami功能:显示出当前终端上使用linux退出计算器命令?
linux退出计算器命令?,工作,地址,系统,命令,通信,信息,电脑,目录,路径,操作,基本linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出