1 回答

TA貢獻(xiàn)1860條經(jīng)驗 獲得超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)
}
在實際測試運行之前。
請注意,此修補(bǔ)程序必須與其他可能運行最終調(diào)用此函數(shù)的測試代碼的 goroutine 同步。
請注意,還有更多的核心方法可以抽象出整個子系統(tǒng)——例如github.com/spf13/afero抽象出所有通過osandpath/filepath包可用的文件系統(tǒng)操作,以及github.com/LopatkinEvgeniy/clock抽象出包中的大多數(shù)功能time。
使用這種方法,您編寫所有代碼的方式使其使用實現(xiàn)特定接口的單個對象來執(zhí)行特定類別的任務(wù),并且在運行時,該對象是“真實的”或“假的” “一個——當(dāng)你做測試的時候。
- 1 回答
- 0 關(guān)注
- 108 瀏覽
添加回答
舉報