我正在设置一些集成测试,我正在一个单独的测试包中进行我的 src 代码。这样做是为了防止循环依赖。单元测试不存储在这里,它们与它们正在测试的文件一起存储。
我的 golang 项目层次结构如下所示:
cmd public ... testing/ main_test.go database_test.go
在 main_test.go 中,我计划初始化与外部依赖项的连接,例如我的测试数据库。
package tests
type Database struct {
...
}
var DB Database
func TestMain(m *testing.M){
SetUpDatabase()
exitCode := m.Run()
os.Exit(exitCode)
}
Run Code Online (Sandbox Code Playgroud)
database_integration_test.go
func Test(t *testing.T) {
tests := []struct {
title string
run func(t *testing.T)
}{
{"should make query", testQuery},
}
for _, test := range tests {
t.Run(test.title, func(t *testing.T) {
test.run(t)
})
}
}
func testQuery(t *testing.T) {
var r result.Result
err := DB.database.DoQuery("").Decode(&r) …Run Code Online (Sandbox Code Playgroud) 我试图了解接口的使用方式。下面是一个人为的例子来证明我的问题。我有主包,它实例化一个测试数据库,然后将其传递到测试服务器,然后在其中初始化服务器。
然后调用服务器,执行虚拟数据库插入(使用虚拟数据库依赖项,在服务器初始化时传递)。
主程序
package main
import (
"interfaces/database"
"interfaces/server"
)
func main() {
db := database.Start()
s := server.Start(db)
s.HandleInsert()
}
Run Code Online (Sandbox Code Playgroud)
数据库.go
package database
import "fmt"
type Database struct {
pool string
}
func Start() *Database{
database := &Database{}
database.pool = "examplepool"
return database
}
func(db *Database) Select() {
fmt.Println("Running a Select")
}
func(db *Database) Insert() {
fmt.Println("Running an Insert")
}
func (db *Database) Delete() {
fmt.Println("Running a Delete")
}
Run Code Online (Sandbox Code Playgroud)
服务器.go
package server
import "fmt"
type Database interface {
Select() …Run Code Online (Sandbox Code Playgroud)