2016-07-20 42 views
1

嗨,我是Go的新手,我正在編寫一個簡單的應用程序,它從env變量中獲取一些配置。我在init函數中這樣做,如下所示。Golang:使用init()進行測試func

type envVars struct { 
    Host  string `env:"APP_HOST"` 
    Username string `env:"APP_USERNAME"` 
    Password string `env:"APP_PASSWORD"` 
} 

var envConfig envVars 

func init() { 
    if err := env.Parse(&envConfig); err != nil { 
     log.Fatal(err) 
    } 
} 

我寫了測試來驗證env變量是否被正確讀取。但問題是我的程序的init func甚至在測試的init函數之前就被調用了。有什麼辦法可以在我的程序的init func被調用之前做某種設置。

func init() { 
    os.Setenv("APP_HOST", "http://localhost:9999") 
    os.Setenv("APP_USERNAME", "john") 
    os.Setenv("APP_PASSWORD", "doe") 
} 

func TestEnvConfig(t *testing.T) { 
    assert.NotNil(t, envConfig) 
    assert.Equal(t, "http://localhost:9999", envConfig.Host) 
} 
+1

不是。 init函數的要點是在所有其他函數之前自動調用。如果你想在init之前做一些事情,你需要將它移出init。 (也讀取env變量不是你通常測試的東西,讀取它們的代碼應該單獨測試) – JimB

回答

0

你的Go測試函數應該是獨立的並且測試一個功能。但在這種情況下,這取決於其他方法,這不是一種很好的測試方法。 init()是一些在代碼執行過程中會被加載的第一步,我認爲在測試方法中使用init並不是真正正確的方法。