在时间敏感的应用程序中,准确模拟当前时间对于单元测试至关重要。然而,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中文网其他相关文章!