在 Go 测试期间处理 Viper 配置文件路径
Handling Viper Config File Path During Go Tests
所以我有一个非常基本的配置,Viper 从我的基本目录读取 .env 文件。如果没有 .env 文件,我会致命地终止进程。当 运行 正常运行我的应用程序时一切顺利。
当我 运行 使用 go test -v ./..
进行测试时,测试框架似乎进入了每个文件的目录,并且每次都调用我的配置 init() 函数,所以 viper.AddConfigPath(".")
指向错误位置。
这是我的目录结构:
/
/restapi
items.go
items_test.go
/util
env.go
main.go
.env
env.go
package util
imports...
// global variables available via util package
var (
Port int
DbURI string
)
func init() {
viper.SetDefault(PORT, 8080)
viper.SetConfigFile(".env")
viper.AddConfigPath(".")
viper.AutomaticEnv()
fmt.Println("---------to see in test printout")
cwd, _ := os.Getwd()
fmt.Println(cwd)
fmt.Println("---------")
if err := viper.ReadInConfig(); err != nil {
log.Fatal("no environment file!")
}
Port = viper.GetInt("PORT")
DbURI = viper.GetString("DB_URI")
}
每个包基本上都依赖于我的 util 包和这个 init 函数,因此每个测试 运行s。有什么方法可以让 viper 始终从基本目录中提取 .env 文件,即使有测试 运行ning 也是如此?我尝试了几种不同的 AddConfigPath() 调用。 Go 有点新。或者这个环境变量的结构设置不会起作用,因为它每次都没有通过我的测试?
所以显然 viper.SetConfigFile()
调用不尊重 viper.AddConfigPath()
调用...我将其修改为使用 viper.SetConfigName(".env")
它实际上会接收对 AddConfigPath 的调用,所以我然后可以为当前目录和父目录添加配置路径。
问题是你给viper.AddConfigPath(".")
方法的路径,但是根据你共享的文件夹结构树,你的环境文件相对路径不在测试文件上,它必须是这样的:viper.AddConfigPath("./../util")
.
所以我有一个非常基本的配置,Viper 从我的基本目录读取 .env 文件。如果没有 .env 文件,我会致命地终止进程。当 运行 正常运行我的应用程序时一切顺利。
当我 运行 使用 go test -v ./..
进行测试时,测试框架似乎进入了每个文件的目录,并且每次都调用我的配置 init() 函数,所以 viper.AddConfigPath(".")
指向错误位置。
这是我的目录结构:
/
/restapi
items.go
items_test.go
/util
env.go
main.go
.env
env.go
package util
imports...
// global variables available via util package
var (
Port int
DbURI string
)
func init() {
viper.SetDefault(PORT, 8080)
viper.SetConfigFile(".env")
viper.AddConfigPath(".")
viper.AutomaticEnv()
fmt.Println("---------to see in test printout")
cwd, _ := os.Getwd()
fmt.Println(cwd)
fmt.Println("---------")
if err := viper.ReadInConfig(); err != nil {
log.Fatal("no environment file!")
}
Port = viper.GetInt("PORT")
DbURI = viper.GetString("DB_URI")
}
每个包基本上都依赖于我的 util 包和这个 init 函数,因此每个测试 运行s。有什么方法可以让 viper 始终从基本目录中提取 .env 文件,即使有测试 运行ning 也是如此?我尝试了几种不同的 AddConfigPath() 调用。 Go 有点新。或者这个环境变量的结构设置不会起作用,因为它每次都没有通过我的测试?
所以显然 viper.SetConfigFile()
调用不尊重 viper.AddConfigPath()
调用...我将其修改为使用 viper.SetConfigName(".env")
它实际上会接收对 AddConfigPath 的调用,所以我然后可以为当前目录和父目录添加配置路径。
问题是你给viper.AddConfigPath(".")
方法的路径,但是根据你共享的文件夹结构树,你的环境文件相对路径不在测试文件上,它必须是这样的:viper.AddConfigPath("./../util")
.