测试包含对 sql 的调用的 Golang 函数。打开没有数据库的连接

所以我刚刚开始掌握 Golang。我正在为有趣的人编写一个应用程序,只是为了理解事物并了解它。


我有一大堆函数将与我传入的数据库进行交互以*SQL.DB供函数使用。我可以使用来自sqlmock的模拟接口轻松地测试这些。


那里没问题。


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


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


所以我猜我的应用程序结构可能很糟糕,或者我错过了一些可能非常明显的东西。


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


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 接口,延迟使用真实数据进行测试,直到我可以将代码输入到开发环境中。


所以我真的很想知道:


我想要的可能吗?有更好的方法吗?


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


湖上湖
浏览 99回答 1
1回答

拉风的咖菲猫

有Dockertest可以创建一个 Docker 容器,运行你想要的任何东西(即 MySQL),你可以针对它进行测试。它旨在能够进行适当的集成测试,因此它应该能够做你想做的事情(你也不再需要sqlmock了)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go