模拟系统调用错误
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/afero
和os
包提供的所有文件系统操作,而path/filepath
则可以提取大部分功能。 github.com/LopatkinEvgeniy/clock
程序包。
使用这种方法,您可以以一种方式编写所有代码,以便它使用实现特定接口的单个对象来执行某些类别的任务,并且在运行时,该对象可以是“实际”对象,也可以是“假”之一-当您进行测试时。
以上是关于模拟系统调用错误的主要内容,如果未能解决你的问题,请参考以下文章