来自golang包的模拟方法

时间:2016-03-07 17:21:24

标签: unit-testing go mocking testify

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

例如,我的项目具有在Os.Getwd()返回错误时尝试恢复的代码。我可以考虑对此进行单元测试的最简单方法是通过模拟Os.Getwd()方法来返回错误,并验证代码是否正常工作。

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

任何人都有这方面的经验吗?

4 个答案:

答案 0 :(得分:2)

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

示例:

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

    func foo(getpid func() int) int {
            return getpid()      
    } 

答案 1 :(得分:1)

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

从阅读中看,测试似乎创建了临时文件夹。

所以一个务实的方法是创建临时文件夹,就像上面提到的测试一样,然后打破它们,以便os.Getwd抛出错误让你抓住你的测试。

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

答案 2 :(得分:1)

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

测试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
}

希望这能回答你的问题。

答案 3 :(得分:0)

这是go编译器的局限性,Google开发人员不想允许任何钩子或猴子补丁。如果单元测试对您很重要-那么您必须选择一种使源代码中毒的方法。所有这些方法如下:

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

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