Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 测试基于时间的字段有意义吗?(戈朗)_Unit Testing_Testing_Time_Go_Mocking - Fatal编程技术网

Unit testing 测试基于时间的字段有意义吗?(戈朗)

Unit testing 测试基于时间的字段有意义吗?(戈朗),unit-testing,testing,time,go,mocking,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 myst

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

这是一个奇怪的问题:为什么不直接测试它们呢?时间怎么可能是零呢?不可能。你说的测试是什么意思?测试两次是否相同?你可以使用时间。不要尝试测试
time.Now()
。时间包有自己的单元测试。如果要检查用户是否没有设置时间,只需检查以下字段:
mystruct.time.IsZero()
。有时,您无法将结构作为一个整体进行比较。为您想要的结构创建一个
Equal
方法。看看net/http/cookiejar如何进行测试,包括时间戳:将实际函数设置为
now
参数,该参数在代码中设置为time.now(),但允许传递合成时间进行测试。