benbjohnson/clock

GitHub: benbjohnson/clock

一个用于在 Go 中模拟时间的轻量级测试辅助库,通过封装标准 time 包实现真实时钟与模拟时钟的透明切换。

Stars: 692 | Forks: 117

# 时钟 [![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/benbjohnson/clock) Clock 是一个小型库,用于在 Go 中模拟时间。它提供了一个接口 封装了标准库的 [`time`][time] 包,这样应用程序 可以使用实时时钟,而测试可以使用模拟时钟。 此模块不再维护。 ## 用法 ### 实时时钟 您的应用程序可以维护一个 `Clock` 变量,这将允许实时时钟与 模拟时钟互换使用。例如,如果您有一个 `Application` 类型: ``` import "github.com/benbjohnson/clock" type Application struct { Clock clock.Clock } ``` 您可以像这样将其初始化为使用实时时钟: ``` var app Application app.Clock = clock.New() ... ``` 然后,所有计时器和与时间相关的功能都应该通过 `Clock` 变量来执行。 ### 模拟时间 在您的测试中,您需要使用 `Mock` 时钟: ``` import ( "testing" "github.com/benbjohnson/clock" ) func TestApplication_DoSomething(t *testing.T) { mock := clock.NewMock() app := Application{Clock: mock} ... } ``` 现在您已经将应用程序初始化为使用模拟时钟,您可以通过编程方式 调整时间。模拟时钟总是从 Unix 纪元(1970 年 1 月 1 日 UTC 午夜)开始。 ### 控制时间 模拟时钟提供了与标准库 `time` 包相同的函数。例如,要查找当前时间,您可以使用 `Now()` 函数: ``` mock := clock.NewMock() // Find the current time. mock.Now().UTC() // 1970-01-01 00:00:00 +0000 UTC // Move the clock forward. mock.Add(2 * time.Hour) // Check the time again. It's 2 hours later! mock.Now().UTC() // 1970-01-01 02:00:00 +0000 UTC ``` 计时器和 Ticker 也由同一个模拟时钟控制。它们只会在时钟向前移动时执行: ``` mock := clock.NewMock() count := 0 // Kick off a timer to increment every 1 mock second. go func() { ticker := mock.Ticker(1 * time.Second) for { <-ticker.C count++ } }() runtime.Gosched() // Move the clock forward 10 seconds. mock.Add(10 * time.Second) // This prints 10. fmt.Println(count) ```
标签:EVTX分析, Go, Mock, Ruby工具, 开发库, 日志审计, 时间模拟, 测试工具