gpt4 book ai didi

go - 测试包含调用 sql.Open 连接但没有数据库的 Golang 函数

转载 作者:行者123 更新时间:2023-12-01 22:22:03 24 4
gpt4 key购买 nike

所以我刚刚开始掌握 Golang。我正在为 funsies 编写一个应用程序,只是为了了解一些东西并了解它。

我有一大堆函数将与数据库交互,我在其中传入 *SQL.DB 以供函数使用。我可以使用 sqlmock 中的模拟接口(interface)轻松地测试它们.

没问题。

我现在正在为应用程序编写初始化函数,它将启动数据库连接,该连接将附加到结构并从那里传递到实用函数。

但是,我正在努力寻找一种方法来轻松测试该连接,而无需设置实际数据库的麻烦。

所以我猜我的应用可能结构不当,或者我遗漏了一些可能非常明显的东西。

所以这里有一些示例代码来说明我的困境。

util.go

package main
import (
"log"
"database/sql"
"github.com/go-sql-driver/mysql"
)

func DoDBStuff(db *sql.DB) {
rows, err := db.Query("SELECT column1, column2 FROM example")
if err != nil {
log.Error(err)
}
// do stuff with rows
}

util_test.go

package main

import (
"testing"
"github.com/DATA-DOG/go-sqlmock"
)

func TestDoDBStuff(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("An error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()

rows := sqlmock.NewRows([]string{"col1", "col2"})
rows.AddRow("val1", "val2")
rows.AddRow("val3", "val4")

mock.ExpectQuery("^SELECT column1, column2 from example$").WillReturnRows(rows)

DoDBStuff(db)

if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}

}

一切正常,我可以测试我的数据库查询。

但是现在我想测试初始化​​应用程序。

package main

import (
"database/sql"
"github.com/go-sql-driver/mysql"
)

type App {
DB *sql.DB
// some other data structures
}

func (a *App) InitApp(connectionString string) {
a.DB = sql.Open("mysql", connectionString)
// other init stuff
}

但是因为我不能传递 SQL 我不认为它可以被模拟,当然不容易。所以我在如何前进上有点挣扎。

我打算将其放在休息 API 后面,因此在启动时,应用程序需要先初始化才能处理任何请求。

理想情况下,我希望能够在无需设置数据库的情况下测试 REST 接口(interface),延迟使用真实数据进行测试,直到我可以将代码输入开发环境。

所以我真的很想知道:

我的意图是可能的吗?有没有更好的方法?

如果不是,我错过了什么?糟糕的测试设计或糟糕的代码设置?

编辑:

根据@peter 的评论,我只想澄清一下。

我想测试 InitDB() 函数的功能,但是对于 sql.Open 调用,我需要有一个数据库供它连接,如果如果我不这样做,我的调用就会失败,并且我无法有效地测试该功能。

最佳答案

Dockertest这会创建一个运行任何你想要的 Docker 容器(即 MySQL),你可以对其进行测试。它旨在能够进行适当的集成测试,因此它应该能够执行您想要的操作(您也不再需要 sqlmock)。

关于go - 测试包含调用 sql.Open 连接但没有数据库的 Golang 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62623174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com