1 回答
TA贡献1860条经验 获得超9个赞
你不能。
但是您可以以一种或另一种方式“将其抽象掉”。
例如,您可以拥有
var sysInfo := unix.SysInfo
func GetBootTime() (time.Time, error) {
currentTime := time.Now()
var info unix.Sysinfo_t
if err := sysInfo(&info); err != nil {
return time.Time{}, fmt.Errorf("error getting system uptime: %s", err)
}
return currentTime.Add(-time.Duration(info.Uptime) * time.Second).Truncate(time.Second), nil
}
…然后在你的测试代码中有类似的东西
sysInfo = func (_ *unix.Sysinfo_t) error {
return syscall.Errno(42)
}
在实际测试运行之前。
请注意,此修补程序必须与其他可能运行最终调用此函数的测试代码的 goroutine 同步。
请注意,还有更多的核心方法可以抽象出整个子系统——例如github.com/spf13/afero抽象出所有通过osandpath/filepath包可用的文件系统操作,以及github.com/LopatkinEvgeniy/clock抽象出包中的大多数功能time。
使用这种方法,您编写所有代码的方式使其使用实现特定接口的单个对象来执行特定类别的任务,并且在运行时,该对象是“真实的”或“假的” “一个——当你做测试的时候。
- 1 回答
- 0 关注
- 76 浏览
添加回答
举报