Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试中当前日期问题的模式_Unit Testing_Design Patterns - Fatal编程技术网

Unit testing 单元测试中当前日期问题的模式

Unit testing 单元测试中当前日期问题的模式,unit-testing,design-patterns,Unit Testing,Design Patterns,对于使用new Date()的代码很难进行单元测试的问题,是否有一种通用的知识模式或习惯用法来解决 我知道一个可能的解决方案(例如),但问题是这个问题是否有共同的模式和语言。我有时做的是构建一个负责返回日期的接口。 例如: public interface ISystemClock { DateTime GetCurrentDate(); } 如果单元测试需要的话,这可以被模拟出来。如果我没有错误地理解您的需求,那么您正在寻找“模拟”: 这为一些不属于测试的底层代码提供了一个伪实

对于使用new Date()的代码很难进行单元测试的问题,是否有一种通用的知识模式或习惯用法来解决


我知道一个可能的解决方案(例如),但问题是这个问题是否有共同的模式和语言。

我有时做的是构建一个负责返回日期的接口。 例如:

public interface ISystemClock
{
    DateTime GetCurrentDate();
}

如果单元测试需要的话,这可以被模拟出来。

如果我没有错误地理解您的需求,那么您正在寻找“模拟”:


这为一些不属于测试的底层代码提供了一个伪实现,但它必须正常工作才能成功测试某些逻辑。

就是这样。你得模仿/假装时间的读数。这可能超出系统时间。您可以有一个通用的“环境”界面,允许您控制测试中的其他非确定性因素。

这个想法就是简单地将任何难以测试的东西(即,为了单元测试的目的而难以控制的东西)移到一个界面后面。接下来,用一个假的或模拟的方法给你提供所需的控制


你在问题中链接的博文在很大程度上是正确的。。然而,我个人不会做最后一点创建一个实例化依赖关系的TestableClock。我更喜欢将其作为一个ctor参数或方法参数传递。

在Java中,模拟Calendar.getInstance()并不是那么简单,也可能不是那么好的做法。在.NET中,我们有一个名为“Moles”的好项目,它在任何程序集中创建任何类的模拟版本(我相信Java的“程序集”是“jar”),所以它变得很简单。例如,如果您使用DateTime.Now,Moles将创建一个MDateTime.Now“Mocked DateTime”,您可以通过在其中设置lambda表达式来更改“Now”的功能。也许Java有点像鼹鼠?谢谢。但这只是另一个解决方案。我在寻找一种模式和通用语言,但似乎每个人都在以自己的方式做这件事。即使解决方案很简单,模式/习惯用法也会有助于沟通。我尝试了这个方法,但我有一些问题。这是我的帖子,你能看一下吗?