【问题标题】:Stubbing time.Now() during tests golang?在测试golang期间存根time.Now()?
【发布时间】:2020-09-18 19:47:17
【问题描述】:

我在这里关注另一个答案:Is there an easy way to stub out time.Now() globally during test?

所以我有这个文件,我可以在其中执行以下操作:

var timeNow = time.Now

func GenerateTimestamp() int64 {
    now := timeNow() // current local time
    sec := now.Unix() // number of seconds since January 1, 1970 UTC

    return sec // int 64
}

我们在另一个函数中使用 GenerateTimestamp()

func AddTs() {
    // Some if check, use GenerateTimestamp() here
}

现在在我的测试文件中,我正在做类似的事情:

    now := time.Now()
    timeNow = func() int64 {
        // fmt.Println("looking for this", now.Unix())
        return now.Unix()
    }

我收到此错误cannot use func literal (type func() int64) as type func() time.Time in assignment。我需要能够返回一个 int64 类型(我的原始函数返回),我该如何解决这个问题?

请随时将我指向文档,我是 Go 新手!!

【问题讨论】:

    标签: go time stubbing go-testing


    【解决方案1】:

    time.Now()是一个返回time.Time类型值的函数:

    func Now() Time
    

    所以timeNow的类型就是这个类型的函数:func() time.Time。这明显不同于func() int64

    您必须返回一个time.Time 值。如果要返回代表特定 unix 时间的 time.Time 值,可以使用 time.Unix() 函数来获取该值,例如

    unixsec := int64(1605139200) // This is 2020-11-12 00:00:00 +0000 UTC
    
    timeNow = func() time.Time {
        return time.Unix(unixsec, 0)
    }
    

    如果你想返回一个特定的日期时间,你可以使用time.Date(),例如:

    timeNow = func() time.Time {
        return time.Date(2020, 11, 12, 0, 0, 0, 0, time.UTC)
    }
    

    当然,您不限于总是返回同一时刻。您可以在每次调用时返回递增的时间值,例如:

    unixsec := int64(1605139200) // This is 2020-11-12 00:00:00 +0000 UTC
    
    timeNow = func() time.Time {
        unixsec++ // Increment number of seconds by 1
        return time.Unix(unixsec, 0)
    }
    

    timeNow 函数将返回一个始终递增 1 秒的时间值(与上一次调用返回的值相比)。

    【讨论】:

    • 感谢您的回复!这非常有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多