1

我一直无法找到从 golang 包中模拟方法的解决方案。

例如,我的项目有代码在 Os.Getwd() 返回错误时尝试恢复。我能想到为此进行单元测试的最简单方法是模拟 Os.Getwd() 方法以返回错误,并验证代码是否相应地工作。

我尝试使用 testify,但似乎不可能。

有人有这方面的经验吗?

4

4 回答 4

3

我自己的解决方案是将方法作为参数,它允许在测试时注入“模拟”。另外,创建一个导出的方法作为公共外观和一个未导出的用于测试。

例子:

    func Foo() int {        
            return foo(os.Getpid)
    }                       

    func foo(getpid func() int) int {
            return getpid()      
    } 
于 2016-03-07T17:37:21.627 回答
0

看起来,看看os.Getwd 测试可以为您提供一些如何测试代码的示例。查找函数TestChdirAndGetwdTestProgWideChdir

从阅读这些内容来看,测试似乎创建了临时文件夹。

因此,一种实用的方法是创建临时文件夹,就像上面提到的测试一样,然后破坏它们,这样os.Getwd会抛出一个错误,让您在测试中捕捉到。

请小心执行这些操作,因为它们可能会弄乱您的系统。我建议在轻量级容器或虚拟机中进行测试。

于 2016-03-07T23:53:01.900 回答
0

我知道这有点晚了,但是,你可以这样做。

测试 DAL 或 SystemCalls 或包调用通常很困难。我解决这个问题的方法是将你的系统函数调用推到接口后面,然后模拟这些接口的函数。例如。

type SystemCalls interface {
 Getwd() error
}


type SystemCallsImplementation struct{
}
func (SystemCallsImplementation) Getwd() error{
 return  Os.Getwd() 
}

func MyFunc(sysCall SystemCalls) error{

sysCall.Getwd()
}

有了这个,您可以注入您的接口,该接口具有对您的函数的系统调用。现在,您可以轻松地创建用于测试的接口的模拟实现。

type MockSystemCallsImplementation struct{
err error
}
func (MockSystemCallsImplementation) Getwd() error{
return err  //this can be set to nil or some value in your test function
}

希望这能回答你的问题。

于 2016-11-10T09:11:47.753 回答
0

这是 go 编译器的限制,谷歌开发者不希望允许任何钩子或猴子补丁。如果单元测试对你很重要——那么你必须选择一种源代码中毒的方法。所有这些方法如下:

  • 您不能直接使用全局包。
  • 您必须创建方法的隔离版本并对其进行测试。
  • 方法的生产版本包括方法的隔离版本和全局包。

但最好的解决方案是完全忽略 Go 语言(如果可能的话)。

于 2020-05-13T23:38:10.020 回答