测试基于时间的字段是否有意义? (golang)

时间:2014-12-16 20:49:46

标签: unit-testing testing time go mocking

我有几个带有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()}
}

1 个答案:

答案 0 :(得分:2)

如果你需要为time.Now()创建一个假,你可以创建TimeProvider并使用它来获取实时。现在(或)伪造它。

这是一个非常简单的例子

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())
}