image

Go如何优雅的写数据库的单测

遇到的问题

​ 当你想在代码中测试 Gorm 时,可以考虑使用单元测试或集成测试来确保 Gorm 的功能正常。下面是一个简单的示例,展示了如何编写一个基本的 Gorm 单元测试。

代码目录结构

  • app
    • config
      • config.yaml
      • conf.go
    • services
      • project.go
      • project_test.go
      • init_test.go
    • cmd
      • main.go

主要代码

// 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"
}
  1. rootDir, err := os.Getwd(): os.Getwd()函数用于获取当前工作目录的路径,并将路径保存在rootDir变量中。如果获取路径时出现错误,错误信息会存储在err变量中。
  2. if strings.HasSuffix(rootDir, "services") { rootDir = filepath.Dir(rootDir) }: 这段代码检查rootDir路径是否以"services"结尾。如果是,它会使用filepath.Dir()函数将路径调整为父目录,即去掉末尾的"services"部分。这段逻辑的目的是确保配置文件所在的目录是正确的。
  3. return rootDir + "/conf/config.yaml": 最后,函数返回拼接好的配置文件路径。它会将rootDir和"/conf/config.yaml"拼接在一起,以构成完整的配置文件路径。这里假设配置文件位于名为"conf"的文件夹下,文件名为"config.yaml"。

总的来说,这段代码的作用是获取当前工作目录路径,检查路径是否以"services"结尾,然后构建配置文件的完整路径并返回。