3 回答
TA贡献1934条经验 获得超2个赞
通过实现自定义界面,您已经走上了正确的道路。我认为您使用了您发布的 golang 坚果线程中的以下建议:
type Clock interface {
Now() time.Time
After(d time.Duration) <-chan time.Time
}
并提供具体的实现
type realClock struct{}
func (realClock) Now() time.Time { return time.Now() }
func (realClock) After(d time.Duration) <-chan time.Time { return time.After(d) }
和测试实现。
在进行测试(或一般情况下)时更改系统时间是一个坏主意。您不知道在执行测试时什么取决于系统时间,并且您不想通过花费数天的时间调试来找出困难的方法。只是不要这样做。
也没有办法在全局范围内隐藏时间包,这样做不会做任何你不能用接口解决方案做的事情。您可以编写自己的时间包,它使用标准库并提供一个函数来切换到模拟时间库以测试它是否是您需要通过困扰您的接口解决方案传递的时间对象。
设计和测试代码的最佳方法可能是使尽可能多的代码无状态。将您的功能拆分为可测试的无状态部分。分别测试这些组件要容易得多。此外,更少的副作用意味着更容易让代码并发运行。
TA贡献1851条经验 获得超4个赞
如果您需要模拟的方法很少,例如Now(),您可以创建一个可以被测试覆盖的包变量:
package foo
import "time"
var Now = time.Now
// The rest of your code...which calls Now() instead of time.Now()
然后在您的测试文件中:
package foo
import (
"testing"
"time"
)
var Now = func() time.Time { return ... }
// Your tests
- 3 回答
- 0 关注
- 203 浏览
添加回答
举报