嗨,我是Go的新手,我正在写一个简单的应用程序,该应用程序从env变量获取一些配置。 我在init函数中执行此操作,如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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函数在测试的init函数之前就被调用了。 有什么方法可以在调用程序的初始化函数之前进行某种设置。
1 2 3 4 5 6 7 8 9 10 | 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) } |
- 并不是的。 初始化函数的要点将在所有其他函数之前自动调用。 如果希望能够在初始化之前执行某些操作,则需要将其移出初始化。 (同样,读取环境变量不是您通常要测试的内容。读取它们的代码应分别进行测试)
- 也许这将有助于stackoverflow.com/questions/23729790/
不太理想,但这对我有用。
在要测试的包装内:
1 2 3 4 5 6 7 | func init() { if len(os.Args) > 1 && os.Args[1][:5] =="-test" { log.Println("testing")//special test setup goes goes here return // ...or just skip the setup entirely } //... } |
- 这不是正确的方法。 请参阅golang.org/pkg/testing或stackoverflow.com/questions/23729790/
您可以在实际测试之前添加Test_parse_params(t * testing.T)函数。 看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | type envVars struct { Host string `env:"APP_HOST"` Username string `env:"APP_USERNAME"` Password string `env:"APP_PASSWORD"` } var envConfig envVars //parse command params func Test_parse_params(t *testing.T) { if err := env.Parse(&envConfig); err != nil { log.Fatal(err) } } func Test_real_test(t *testing.T) { .... } |