Глобальная переменная, определенная в одной функции, не сохраняет определение в другой - PullRequest
0 голосов
/ 02 мая 2018

После некоторого чтения я думаю, что мне нужна эта 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 - ссылка на полный фрагмент кода.

1 Ответ

0 голосов
/ 02 мая 2018

Ваша строка db, err := sql.Open("mysql", os.Getenv("DSN")) создает локальную переменную db (локальную для функции TestMain). Вместо этого используйте:

err := nil
db, err = sql.Open("mysql", os.Getenv("DSN"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...