嗨,我在试着让我的功能单元可以测试。其中一项建议是将该函数赋值为一个变量,并使其可在全球范围内访问。我刚这么做,但现在我正在经历一个初始化循环,下面是我的代码
////////////////////////
// main.go
////////////////////////
func DownloadFile(filename string) {
// Initialized request variable here
// ... doing initialization
// End of initialization
res = ProcessDownload(request)
if res == 401 {
return doRetry(filename)
}
// some code here
return downloadFile(filename)
}
func DoRetry(filename string) {
// Doing some database insert/updating
return downloadFile(string)
}在我的另一个文件中,我将这个函数赋值给变量。
//////////////////////
// global.go
//////////////////////
var downloadFile = DownloadFile
var doRetry = DoRetry我在global.go中这样做的原因是为了使DoRetry和DownloadFile单元可测试。也就是说,使用此方法,我可以模拟函数,而无需创建接口。因为这只是一个独立的函数,所以不需要在某个类中。变量的其余部分都是可以的,但是当涉及到执行递归行为的函数时,我会得到以下错误
./global.go:22:5: initialization loop:
/go/src/project/global.go:22:5 downloadFile refers to
/go/src/project/process.go:403:99 DownloadFile refers to
/go/src/project/global.go:23:5 doRetry refers to
/go/src/project/process.go:394:89 DoRetry refers to
/go/src/project/global.go:22:5 downloadFile
FAIL project [build failed]我知道这可能是here中的重复,但我看不出这里的解决方案是如何解决我的问题的。
请帮帮我。谢谢我在这个链接中读到了关于模拟一个函数的文章。
https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html
发布于 2018-08-03 07:49:10
解决方案是在声明downloadFile和doRetry函数变量时不赋值,而是将初始化“推迟”到包init()函数,如下所示:
var downloadFile func(string) //= DownloadFile
var doRetry func(string) //= DoRetry
func init() {
downloadFile = DownloadFile
doRetry = DoRetry
}这样,变量首先将使用nil (函数类型的零值)初始化,这意味着它们不依赖于DownloadFile()和DoRetry()函数,稍后当包init()函数运行时,将为变量分配函数值,因此不会发生初始化循环。
https://stackoverflow.com/questions/51667411
复制相似问题