所以我剛剛開始掌握 Golang。我正在為有趣的人編寫一個應(yīng)用程序,只是為了理解事物并了解它。我有一大堆函數(shù)將與我傳入的數(shù)據(jù)庫進行交互以*SQL.DB供函數(shù)使用。我可以使用來自sqlmock的模擬接口輕松地測試這些。那里沒問題。我現(xiàn)在正在為應(yīng)用程序編寫初始化函數(shù),該函數(shù)將啟動數(shù)據(jù)庫連接,該連接將附加到一個結(jié)構(gòu)并從那里傳遞給實用程序函數(shù)。但是,我正在努力尋找一種方法來輕松測試該連接而無需設(shè)置實際數(shù)據(jù)庫的麻煩。所以我猜我的應(yīng)用程序結(jié)構(gòu)可能很糟糕,或者我錯過了一些可能非常明顯的東西。所以這里有一些示例代碼來說明我的困境。util.gopackage mainimport ( "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.gopackage mainimport ( "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) }}一切正常,我可以測試我的數(shù)據(jù)庫查詢。但是現(xiàn)在我想測試初始化應(yīng)用程序。package mainimport ( "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我認(rèn)為它不能被嘲笑,當(dāng)然不容易。所以我在如何前進方面有點掙扎。我打算讓它坐在休息 API 后面,所以在啟動時,應(yīng)用程序需要在能夠處理任何請求之前進行初始化。理想情況下,我希望能夠在無需設(shè)置數(shù)據(jù)庫的情況下測試 REST 接口,延遲使用真實數(shù)據(jù)進行測試,直到我可以將代碼輸入到開發(fā)環(huán)境中。所以我真的很想知道:我想要的可能嗎?有更好的方法嗎?如果不是,我錯過了什么?糟糕的測試設(shè)計或糟糕的代碼設(shè)置?
1 回答

拉風(fēng)的咖菲貓
TA貢獻1995條經(jīng)驗 獲得超2個贊
有Dockertest可以創(chuàng)建一個 Docker 容器,運行你想要的任何東西(即 MySQL),你可以針對它進行測試。它旨在能夠進行適當(dāng)?shù)募蓽y試,因此它應(yīng)該能夠做你想做的事情(你也不再需要sqlmock
了)。
- 1 回答
- 0 關(guān)注
- 116 瀏覽
添加回答
舉報
0/150
提交
取消