模拟系统调用错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟系统调用错误相关的知识,希望对你有一定的参考价值。

假设我具有以下功能,我想为其编写测试:

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返回错误?

答案

您不能。

但是您可以以一种或另一种方式“将其抽象化”。

例如,您可以拥有

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同步,这些goroutine可能会运行最终调用此函数的测试代码。


[请注意,还有更多的硬性方法可以提取整个子系统,例如github.com/spf13/afero可以提取通过github.com/spf13/aferoos包提供的所有文件系统操作,而path/filepath则可以提取大部分功能。 github.com/LopatkinEvgeniy/clock程序包。

使用这种方法,您可以以一种方式编写所有代码,以便它使用实现特定接口的单个​​对象来执行某些类别的任务,并且在运行时,该对象可以是“实际”对象,也可以是“假”之一-当您进行测试时。

以上是关于模拟系统调用错误的主要内容,如果未能解决你的问题,请参考以下文章

模拟系统调用错误

如何从片段 KOTLIN 中调用意图 [重复]

为模拟令牌调用 DuplicateTokenEx 后仍然出现重复令牌错误

为啥片段恢复后再次调用onLoadFinished?

是否可以在片段中手动调用 onCreateView?

调用片段活动错误无法实例化活动。无法转换为 android.app.Activity