比较单元测试中的当前时间

时间:2017-06-20 11:03:12

标签: unit-testing go

我目前正在编写一个与字符串进行比较的单元测试。第一个字符串是使用函数生成的。另一个是硬编码的,可作为参考。我的问题是,创建第一个字符串的函数会将当前时间(time.Now())精确地以秒为单位注入字符串。目前我也做同样的参考,但这对我来说似乎很难看。我的机器运行得足够快,以便测试通过,但我不想依赖它。

进行此类测试的一般技术是什么?

2 个答案:

答案 0 :(得分:1)

您可以通过time.Now()函数将_test.go文件中的init()等函数存根,这将给出确定的时间值:

package main

import (
    "fmt"
    "time"
)

var timeNow = time.Now

func main() {
    fmt.Println(timeNow())
}

func init() {
    // Uncomment and add to _test.go init()
    // timeNow = func() time.Time {
    //  t, _ := time.Parse("2006-01-02 15:04:05", "2017-01-20 01:02:03")
    //  return t
    // }
}

请参阅:https://play.golang.org/p/hI6MrQGyDA

答案 1 :(得分:0)

我们可以使用 go 包 "github.com/tkuchiki/faketime" 来存根 time.Now()。

package main

import (
    "fmt"
    "github.com/tkuchiki/faketime"
    "time"
)

func main() {
    fmt.Println("Current Time Before Faking : ", time.Now().UTC())

    f := faketime.NewFaketime(2021, time.March, 01, 01, 01, 01, 0, time.UTC)
    defer f.Undo()
    f.Do()

    fmt.Println("Current Time After Faking : ", time.Now())

}

上面代码的输出是:

Current Time Before Faking :  2009-11-10 23:00:00 +0000 UTC
Current Time After Faking :  2021-03-01 01:01:01 +0000 UTC

检查示例代码:go-playground sample