在 Golang 中存根一个函数



有一个函数不断出现在我负责单元测试的代码中(甚至还没有测试过(,定义如下:

//Get Retreives an error with the given access code.
func Get(code AccessCode) *ErrorSt {
if err, ok := Errors[code]; ok {
err.Stack = utilityCore.GetCleanStack(logger.Instance.GetProjectNames())
return &err
}
err := NewError(string(ACPanic), fmt.Sprintf("Error '%s' can't be retreived.", code), ESSystem, SError)
return err
}

到目前为止,我尝试测试的几种方法调用了它。我的直觉是存根或监视该功能,但这失败了。

这个函数在我雇主的 API 中很多地方都使用,因此我无法更改它(如果我这样做,它会破坏很多东西(。有没有办法进行真正的单元测试并测试加倍?

我的间谍尝试:

type ErrorSpy struct {
spies.Spy
}
func (spy *ErrorSpy) Get(code AccessCode) *ErrorSt {
res := spy.Called(code)
return res.Get(0).(*ErrorSt)
}

了解到间谍只能在从接口实现的方法上可行(我已经习惯了 Java,一切都是方法!我和老板谈过,他拒绝重构这个函数的建议,以及使用它的所有实例,一个方法。

如果做不到这一点,我不得不打破单元测试的核心原则,并担心Get会返回什么。幸运的是,就我而言,它试图从地图Errors返回ErrorSt。看到这一点,我不得不简单地执行以下操作:

errors := Errors
Errors = map[AccessCode]ErrorSt { 
// anything I expect Get to return 
}
defer func() { Errors = errors }()

然后我就可以走了。

最新更新