为了账号安全,请及时绑定邮箱和手机立即绑定

模拟系统调用错误

模拟系统调用错误

Go
守着星空守着你 2022-06-13 10:27:33
假设我有以下要编写测试的功能: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返回错误?
查看完整描述

1 回答

?
慕码人2483693

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。


使用这种方法,您编写所有代码的方式使其使用实现特定接口的单个对象来执行特定类别的任务,并且在运行时,该对象是“真实的”或“假的” “一个——当你做测试的时候。


查看完整回答
反对 回复 2022-06-13
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信