首页 > 后端开发 > Golang > 如何在 Go 中有效地全局删除 `time.Now()` 进行测试?

如何在 Go 中有效地全局删除 `time.Now()` 进行测试?

Barbara Streisand
发布: 2025-01-01 06:16:10
原创
298 人浏览过

How Can I Effectively Stub Out `time.Now()` Globally for Testing in Go?

全局消除 time.Now():探索替代方案

在测试依赖于时间敏感功能的代码时,需要模拟时间进展。虽然实现自定义时间接口可能是一种有效的解决方案,但由于需要传递变量来跟踪实际经过的时间,其使用可能会变得很麻烦。

自定义时间包

作为替代方案,请考虑创建一个包含标准库时间包的自定义时间包。这种方法允许您在实时实现和模拟实现之间无缝切换以进行测试。例如:

// custom_time.go
package custom_time

import (
    "time"
    "sync"
)

var (
    mockTime time.Time
    mockMutex sync.Mutex
)

func SetMockTime(t time.Time) {
    mockMutex.Lock()
    mockTime = t
    mockMutex.Unlock()
}

func ResetMockTime() {
    mockMutex.Lock()
    mockTime = time.Time{}
    mockMutex.Unlock()
}

func Now() time.Time {
    mockMutex.Lock()
    defer mockMutex.Unlock()
    if mockTime != (time.Time{}) {
        return mockTime
    }
    return time.Now()
}
登录后复制

自定义包的优点

  • 全局范围:此方法将 time.Now() 存根测试范围内时间包的所有实例。
  • 简单切换:使用 SetMockTime 和 ResetMockTime 函数可以直接在真实时间和模拟时间之间切换。
  • 可维护性:保留单独的时间包用于测试目的可以增强代码组织。

定制的缺点包

  • 额外抽象:由于额外的抽象层可能会带来轻微的开销。

系统警告时钟修改

强烈建议不要在运行期间修改系统时钟模拟时间进展的测试。这可能会给依赖准确系统时间的其他系统组件带来不可预测的后果。

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

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