【问题标题】:Global variable defined in one function does not keep definition in another在一个函数中定义的全局变量不会在另一个函数中保留定义
【发布时间】:2018-10-12 11:34:24
【问题描述】:

经过阅读,我想我需要这个TestMain(m *testing.M) 构造来设置我的数据库。然而,在运行测试时,db 总是 nil。我该如何解决这个问题?

var db *sql.DB

func TestMain(m *testing.M) {

        db, err := sql.Open("mysql", os.Getenv("DSN"))
        if err != nil {
                log.Fatal("error opening database")
        }

        defer db.Close()
        log.Printf("here testing with %v", db)
        code := m.Run()
        log.Printf("finished test")
        os.Exit(code)

}

func Test_getRole(t *testing.T) {
        if db == nil {
                t.Fatalf("db is nil")
        }
}

输出是:

2018/05/02 19:10:14 here testing with &{{bugzilla:SECRET@tcp(example.com:3306)/bugzilla?multiStatements=true 0x7aba40} 0 {0 0} [] map[] 0 0 0xc42001e180 0xc4200740c0 false map[] map[] 0 0 0 <nil> 0x4e9850}
--- FAIL: Test_getRole (0.00s)
        main_test.go:32: db is nil

https://github.com/unee-t/processInvitations/blob/testfail/main_test.go#L43 是完整代码的链接。

【问题讨论】:

    标签: mysql testing go


    【解决方案1】:

    您的db, err := sql.Open("mysql", os.Getenv("DSN")) 行创建了一个局部变量db(函数TestMain 的局部变量)。而是使用:

    err := nil
    db, err = sql.Open("mysql", os.Getenv("DSN"))
    

    【讨论】:

    • 啊……未定义的错误抓住了我。 github.com/unee-t/processInvitations/commit/… 讨厌这样。谢谢!如果您对我的代码有任何其他反馈,请告诉我。
    • 不客气!我建议将名称更改为 - “在一个函数中定义的全局变量不会在另一个函数中保留定义”。这样,有类似问题的几个人将能够快速调试它。这个问题在 Go 中会比较常见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多