gpt4 book ai didi

unit-testing - 数据库连接get的单元测试策略

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:14 25 4
gpt4 key购买 nike

被测代码中有一个方法,它只是尝试获取数据库连接,如果无法连接则返回错误。

它,以及涉及的结构体定义如下:

type DatabaseContext struct {
Context
Database DatabaseSt
}


// //GetInfo Returns the context.
// func (c *DatabaseContext) GetInfo() *Context {
// return &c.Context
// }

//GetDB Gets the database connection from the connection string.
func (c *DatabaseContext) GetDB() (*sql.DB, *errors.ErrorSt) {
var errSt *errors.ErrorSt
if c.Database.dbConnection == nil {
c.Database.dbConnection, errSt = c.openDB()
if errSt != nil {
return nil, errSt
}
c.Database.dbConnection.SetMaxOpenConns(50)
}
return c.Database.dbConnection, nil
}

在同一个文件中,它可能命中的其他方法如下:

//openDB opens the database with the connection string.
func (c *DatabaseContext) openDB() (*sql.DB, *errors.ErrorSt) {
if c.Database.DBConnectionStr == "" {
c.GetDatabase()
}
return db.OpenConnection(c.Database.DBConnectionStr, c.Database.InterpolateParams)

}

//CloseDB Closes the database.
func (c *DatabaseContext) CloseDB() {
if c.Database.dbConnection != nil {
c.Database.dbConnection.Close()
}
}

//SetDatabaseString Sets the database string into the session.
func (c *DatabaseContext) SetDatabaseString(str string) {
c.Database.DBConnectionStr = str
i := strings.Index(str, ")/") + 2
c.Database.DBName = str[i:]
c.SetDatabase()
}

//GetDatabaseString Gets the database string from the session.
func (c *DatabaseContext) GetDatabase() {
if dbIntf := c.GetFromSession("Database"); dbIntf != nil {
c.Database = dbIntf.(DatabaseSt)
}
}

//SetDatabaseString Sets the database string into the session.
func (c *DatabaseContext) SetDatabase() {
c.SetToSession("Database", c.Database)
}

幸运的是,DatabaseContext 实现了 DatabaseContextIntf,我想将其用于测试。我的直觉是直接模拟 DatabaseContext,但这行不通,因为它不是接口(interface)(在 Golang 中,您只能模拟接口(interface))。

我将如何着手测试这个,而不触及真实的数据库,这可能会超出我的控制范围(从而在测试中创建错误的失败)?

更新 我的问题与可疑的重复问题不同,因为他们的问题是关于数据库条目,而不是连接。标记的重复项是指 this library然而,作为答案,为了测试,它没有方法返回一个 nil 的“连接”。最好的是New它创建了一个测试双重连接,并且无法控制返回值的状态(我需要它在一个测试(“无连接”)中为 nil 而在另一个测试中为非零(“健全性测试"))

最佳答案

我最终使测试包与被测代码的包相同(这允许 Visual Studio Code 中的测试生成器将生成的测试直接放在测试文件中,而不会混淆,以及让我访问未导出的字段,我使用过),然后直接制作了一个假的 DatabaseContext

我的测试用例是这样的:

t.Run("SanityTest", func(t *testing.T) {
c := new(DatabaseContext)
assert.Nil(t, c.Database.dbConnection)
database, err := c.GetDB()
defer database.Close()
assert.NotNil(t, database)
if !assert.Nil(t, err) {
t.Error(err.ToString(false))
}
})

关于unit-testing - 数据库连接get的单元测试策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827365/

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