Go如何优雅的写数据库的单测
遇到的问题
当你想在代码中测试 Gorm 时,可以考虑使用单元测试或集成测试来确保 Gorm 的功能正常。下面是一个简单的示例,展示了如何编写一个基本的 Gorm 单元测试。
代码目录结构
- app
- config
- config.yaml
- conf.go
- services
- project.go
- project_test.go
- init_test.go
- cmd
- main.go
- config
主要代码
// init_test.go
package managers
import (
"testing"
"git.xxxxxx.com/xxx/xxx/config"
"git.xxxxxx.com/xxx/xxx//models"
_ "xxxx.com/xxx/mysql" // import your used driver
)
func TestMain(m *testing.M) {
config.GetConfig()
models.Init()
m.Run()
}
// conf.go
func getConfigFileName() string {
rootDir, err := os.Getwd()
if err != nil {
panic(err)
}
if strings.HasSuffix(rootDir, "services") {
rootDir = filepath.Dir(rootDir)
}
return rootDir + "/conf/config.yaml"
}
func GetConfig() *Config {
configFile := getConfigFileName()
bytes, err := ioutil.ReadFile(configFile)
if err != nil {
panic(fmt.Errorf("read config %s failed:%v", configFile, err))
}
config := Config{}
if err := yaml.Unmarshal(bytes, &config); err != nil {
panic(fmt.Errorf("parse config %s failed:%v", configFile, err))
}
return &config
}
// project_test.go
package managers
import (
"context"
"fmt"
"testing"
)
func TestProjectByID(t *testing.T) {
manager := NewProjectManager(context.TODO())
item, err := manager.ProjectByID(234)
if err != nil {
fmt.Println(err)
}
fmt.Println("item:", item)
}
主要函数分析
func getConfigFileName() string {
rootDir, err := os.Getwd()
if err != nil {
panic(err)
}
if strings.HasSuffix(rootDir, "services") {
rootDir = filepath.Dir(rootDir)
}
return rootDir + "/conf/config.yaml"
}
rootDir, err := os.Getwd()
:os.Getwd()
函数用于获取当前工作目录的路径,并将路径保存在rootDir
变量中。如果获取路径时出现错误,错误信息会存储在err
变量中。if strings.HasSuffix(rootDir, "services") { rootDir = filepath.Dir(rootDir) }
: 这段代码检查rootDir
路径是否以"services"结尾。如果是,它会使用filepath.Dir()
函数将路径调整为父目录,即去掉末尾的"services"部分。这段逻辑的目的是确保配置文件所在的目录是正确的。return rootDir + "/conf/config.yaml"
: 最后,函数返回拼接好的配置文件路径。它会将rootDir
和"/conf/config.yaml"拼接在一起,以构成完整的配置文件路径。这里假设配置文件位于名为"conf"的文件夹下,文件名为"config.yaml"。
总的来说,这段代码的作用是获取当前工作目录路径,检查路径是否以"services"结尾,然后构建配置文件的完整路径并返回。