当前位置: 首页 > 面试题库 >

有没有一种简单的方法可以在测试过程中全局分配time.Now()?

微生乐
2023-03-14
问题内容

我们的代码的一部分是时间敏感的,我们需要保留一些内容,然后在30-60秒之内释放它,等等,我们可以 time.Sleep(60 * time.Second)

我刚刚实现了时间接口,并且在测试过程中使用了时间接口的存根实现,类似于此golang-
nuts讨论

但是,time.Now()在多个站点中称为,这意味着我们需要传递一个变量来跟踪我们实际睡了多少时间。

我想知道是否存在另一种在time.Now()全球范围内存根的方法。也许进行系统调用来更改系统时钟?

也许我们可以编写自己的时间包,该时间包基本上包裹了时间包,但允许我们对其进行更改?

我们当前的实施效果很好,我是初学者,我很好奇是否有人有其他想法?


问题答案:

通过实现自定义界面,您 已经走上了正确的道路 。我认为您可以使用您发布的golang螺母线程中的以下建议:

type Clock interface {
  Now() time.Time
  After(d time.Duration) <-chan time.Time
}

并提供具体的实施

type realClock struct{}
func (realClock) Now() time.Time { return time.Now() }
func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }

和测试实施。

原版的

在进行测试时(或一般而言)更改系统时间是一个坏主意
。您不知道执行测试时取决于系统时间的原因,也不想花很多天的调试时间来找出困难的方法。只是不要这样做。

也没有办法在全局范围内隐藏时间包,
并且这样做不会做接口解决方案无法做的任何事情。您可以编写自己的时间包,该时间包使用标准库,并提供切换到模拟时间库以测试是否是您需要通过麻烦的接口解决方案传递的时间对象的功能。

设计和测试代码的最佳方法可能是使尽可能多的代码变为无状态。将您的功能拆分为可测试的无状态部件。分别测试这些组件会容易得多。同样,副作用更少意味着使代码并发运行变得容易得多。



 类似资料:
  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask-principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask-principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会话。

  • 我知道一个测试可以通过运行来运行,在sbt中, 有没有办法告诉sbt/scalatest在没有标签的情况下运行单个测试?例如: 这意味着“在类中运行第二个测试。不管它是什么”。我们有一堆测试,没有人费心去标记它们,那么有没有办法在没有标签的情况下运行单个测试?

  • 问题内容: 我正在建立一个带有flask的网站,其中用户具有帐户并能够登录。我正在使用flask- principal作为登录部分和角色管理。有没有办法让用户的会话在5分钟或10分钟后过期?我在flask文档或flask- principal文档中找不到该文件。 我想到了一种手动方法,在登录时在服务器端设置一个带有时间标签的变量,并在用户执行下一个操作时,服务器会验证该时间戳记上的时间增量并删除会

  • 问题内容: 我正在研究Java应用程序的一部分,该应用程序将图像作为字节数组,将其读入实例,然后将其传递给第三方库进行处理。 对于单元测试,我想获取一个图像(从磁盘上的文件中获取),并断言它等于代码处理过的同一图像。 我的 预期 是使用从磁盘上的PNG文件读取的。 我的 测试 代码将相同的文件读入A,并将其作为PNG写入字节数组,以提供给被测系统。 当被测系统将字节数组写入新数组时,我想断言这两个

  • 问题内容: 我非常喜欢Visual Studio在完成已编写的代码和所引用的ALSO代码(各种库/程序集)时为您提供注释文档/参数名称的方式。 在完成代码或将方法悬停在方法上时,是否有一种简单的方法可以在Eclipse中获取内联javadoc /参数名称?通过插件?通过某些设置?使用大量的库(就像在Java中经常发生的那样)然后当您将其放在源jar中时,必须去网站或本地javadoc位置查找信息,