首页 >后端开发 >Golang >如何全局删除 `time.Now()` 以便于测试?

如何全局删除 `time.Now()` 以便于测试?

Linda Hamilton
Linda Hamilton原创
2025-01-01 03:38:16405浏览

How to Globally Stub Out `time.Now()` for Easier Testing?

如何全局存根 time.Now() 进行测试

在编码中,某些元素可能对时间敏感,需要进行操作用于测试目的的时间。一种方法是在测试中删除 time.Now() 。然而,time.Now() 被频繁调用,因此需要维护一个变量来监控实际经过的睡眠时间。

本文研究了全局消除 time.Now() 的替代方法,包括使用自定义界面以及创建修改后的“时间”包的可能性。

自定义界面方法

自定义接口方法涉及实现类似于以下的接口:

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

此接口为 Now() 和 After() 方法提供占位符,允许您定义测试和生产的具体实现。例如:

type realClock struct{}

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

潜在问题

虽然自定义界面方法很有效,但它也有一些警告:

  • 传递接口变量:您可能需要将时钟接口作为参数传递给函数和使用 time.Now().
  • 无全局替换: 此方法不提供 time.Now().

替代方法

  • 修改“时间”包:可以创建一个修改后的“时间”包,它包装标准库的时间包,并提供切换到模拟时间库进行测试的机制。
  • 无状态代码设计: 为了避免副作用并方便测试,请考虑使用无状态设计代码

警告:

在运行测试时或一般情况下不建议更改系统时间,因为它可能会导致意外的依赖关系和调试问题。

结论

存根time.Now() 全局测试需要仔细考虑。虽然自定义界面方法是一个可行的选择,但它可能会带来额外的复杂性。或者,您可以创建修改后的“时间”包或使用无状态组件设计代码以简化测试。

以上是如何全局删除 `time.Now()` 以便于测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn