我有几个字段类型为 time.Time
的结构。我想知道测试它们的最佳做法是什么?我是否应该简单地将 time.Time
字段设置为 nil 并测试结构的其余部分(即 reflect.DeepEqual)?否则有没有办法让时间确定?
给定以下功能,您将如何测试它?
type mystruct struct {
s string
time time.Time
}
// myfunc receives a string and returns a struct of type mystruct
// with the same string and the current time.
func myfunc(s string) mystruct {
return mystruct{s: s, time: time.Now()}
}
最佳答案
如果您需要为 time.Now() 创建一个假的,您可以创建 TimeProvider 并使用它来获取实时的。Now() 或伪造它。
这是一个非常简单的例子
package main
import (
"fmt"
"time"
)
type TimeProvider interface {
Now() time.Time
}
type MyTimeProvider struct{}
func (m *MyTimeProvider) Now() time.Time {
return time.Now()
}
type FakeTimeProvider struct {
internalTime time.Time
}
func (f *FakeTimeProvider) Now() time.Time {
return f.internalTime
}
func (f *FakeTimeProvider) SetTime(t time.Time) {
f.internalTime = t
}
func main() {
var t MyTimeProvider
f := FakeTimeProvider{t.Now()}
fmt.Println(t.Now())
fmt.Println(f.Now())
}
关于unit-testing - 测试基于时间的字段是否有意义? (戈朗),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513690/