猿问

模拟系统调用错误

假设我有以下要编写测试的功能:


func GetBootTime() (time.Time, error) {

  currentTime := time.Now()

  var info unix.Sysinfo_t

  if err := unix.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

}

我怎样才能unix.Sysinfo返回错误?


守着星空守着你
浏览 77回答 1
1回答

慕码人2483693

你不能。但是您可以以一种或另一种方式“将其抽象掉”。例如,您可以拥有var sysInfo := unix.SysInfofunc 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。使用这种方法,您编写所有代码的方式使其使用实现特定接口的单个对象来执行特定类别的任务,并且在运行时,该对象是“真实的”或“假的” “一个——当你做测试的时候。
随时随地看视频慕课网APP

相关分类

Go
我要回答