首页 > 后端开发 > Golang > 如何有效地去除 Golang 单元测试的 `time.Now()` ?

如何有效地去除 Golang 单元测试的 `time.Now()` ?

Susan Sarandon
发布: 2025-01-01 00:00:12
原创
590 人浏览过

How to Effectively Stub Out `time.Now()` for Golang Unit Tests?

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

在时间敏感的应用程序中,准确模拟当前时间对于单元测试至关重要。然而,time.Now() 经常在多个位置调用,这使得准确跟踪经过的时间变得困难。

使用自定义接口

您引用的 golang-nuts 线程中建议的解决方案通过定义包装时间包功能的自定义 Clock 接口提供了可靠的方法:

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) }
登录后复制

为了测试,创建 Clock 接口的模拟实现。

处理系统时间更改

虽然更改系统时间似乎很诱人在全球范围内进行测试,强烈建议不要采用这种方法。它可能会引入不可预测的依赖关系和副作用。

自定义时间包

作为替代方案,请考虑创建一个包装标准库时间包的自定义时间包。此自定义包可以提供在测试期间切换到模拟时间实现的功能。

时间敏感代码的最佳实践

为了提高可测试性并减少副作用,请努力设计您的代码尽可能使用无状态组件。通过将代码构建为单独的、可测试的部分,您可以简化单元测试过程,并更轻松地确保不同时间条件下的正确行为。

以上是如何有效地去除 Golang 单元测试的 `time.Now()` ?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板