一尘不染

有没有一种简单的方法可以在测试期间全局排除 time.Now() ?

go

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

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

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

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

也许我们可以编写自己的时间包,它基本上环绕时间包但允许我们更改它?

我们目前的实现效果很好,我是一个初学者,我很想知道是否有人有其他想法?


阅读 137

收藏
2021-12-28

共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) }

测试实现。

2021-12-28