一尘不染

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

go

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

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

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

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

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

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


阅读 237

收藏
2020-07-02

共1个答案

一尘不染

通过实现自定义界面,您 已经走上了正确的道路 。我认为您可以使用您发布的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) }

和测试实施。


原版的

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

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

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

2020-07-02