benbjohnson/clock
GitHub: benbjohnson/clock
一个用于在 Go 中模拟时间的轻量级测试辅助库,通过封装标准 time 包实现真实时钟与模拟时钟的透明切换。
Stars: 692 | Forks: 117
# 时钟
[](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工具, 开发库, 日志审计, 时间模拟, 测试工具