【问题标题】:Initialization loop Golang初始化循环 Golang
【发布时间】:2019-01-11 00:56:44
【问题描述】:

您好,我正在尝试使我的功能单元可测试。其中一个建议是将函数分配给变量并使其全局可访问。我刚刚这样做了,但现在我遇到了一个初始化循环,下面是我的代码

////////////////////////
// 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 中这样做的原因是为了使 DoRetryDownloadFile 单元可测试。这意味着我可以在不创建界面的情况下 MOCK 函数。因为这只是一个独立的功能,不需要在某个类中。变量的所有其余部分都可以,但是当涉及到执行递归行为的函数时,我得到以下错误

./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 重复,但我看不出这里的解决方案如何解决我的问题。

请帮助我。谢谢 我在此链接中阅读了有关模拟函数的内容

Mock functions in Go

https://husobee.github.io/golang/testing/unit-test/2015/06/08/golang-unit-testing.html

【问题讨论】:

    标签: unit-testing go mocking testify


    【解决方案1】:

    解决方案是在声明 downloadFiledoRetry 函数变量时不赋值,而是将初始化“推迟”到包 init() 函数,如下所示:

    var downloadFile func(string) //= DownloadFile
    var doRetry func(string)      //= DoRetry
    
    func init() {
        downloadFile = DownloadFile
        doRetry = DoRetry
    }
    

    这样,变量首先将使用nil(函数类型的零值)初始化,这意味着它们不依赖于DownloadFile()DoRetry() 函数,稍后 init() 包函数运行,它将函数值分配给变量,因此不会发生初始化循环。

    【讨论】:

    • 哇,这听起来很完美。只有一个菜鸟问题。我应该将函数 init() 放在哪里?这可以进入任何文件吗?还是应该在 main.go 下?
    • @MadzmarUllang 直觉上你应该把这个init() 函数放在它们初始化的变量下面,如果它不会引起任何问题的话。你可以有多个包init()函数。
    • 伟大的会试试这个。我认为这真的会解决它
    • 试过了,效果很好......非常感谢你真的救了我
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2011-04-02
    • 2020-12-17
    • 2016-05-29
    相关资源
    最近更新 更多