2 回答

TA貢獻(xiàn)1829條經(jīng)驗 獲得超7個贊
你需要使用這個:https ://github.com/DATA-DOG/go-sqlmock
它非常易于使用。這是一個使用模擬 SQL 測試控制器的示例:
執(zhí)行
func (up UserProvider) GetUsers() ([]models.User, error) {
var users = make([]models.User, 0, 10)
rows, err := up.DatabaseProvider.Query("SELECT firstname, lastname, email, age FROM Users;")
if err != nil {
return nil, err
}
for rows.Next() {
var u models.User = models.User{}
err := rows.Scan(&u.Name, &u.Lastname, &u.Email, &u.Age)
if err != nil {
return nil, err
}
users = append(users, u)
}
if err := rows.Err(); err != nil {
return nil, err
}
return users, nil
}
測試
func TestGetUsersOk(t *testing.T) {
db, mock := NewMock()
mock.ExpectQuery("SELECT firstname, lastname, email, age FROM Users;").
WillReturnRows(sqlmock.NewRows([]string{"firstname", "lastname", "email", "age"}).
AddRow("pepe", "guerra", "pepe@gmail.com", 34))
subject := UserProvider{
DatabaseProvider: repositories.NewMockDBProvider(db, nil),
}
resp, err := subject.GetUsers()
assert.Nil(t, err)
assert.NotNil(t, resp)
assert.Equal(t, 1, len(resp))
}
func NewMock() (*sql.DB, sqlmock.Sqlmock) {
db, mock, err := sqlmock.New()
if err != nil {
log.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
return db, mock
}

TA貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊
我發(fā)現(xiàn)針對實時數(shù)據(jù)庫編寫測試可以實現(xiàn)更高質(zhì)量的測試。Postgres 面臨的挑戰(zhàn)是沒有可以替代的好的內(nèi)存?zhèn)卧炱贰?/p>
我想出的是建立 postgres Docker 容器并在其中創(chuàng)建臨時數(shù)據(jù)庫。github.com/bitcomplete/sqltestutil包中的PostgresContainer類型正是這樣做的:
# Postgres version is "12"
pg, _ := sqltestutil.StartPostgresContainer(context.Background(), "12")
defer pg.Shutdown(ctx)
db, err := sql.Open("postgres", pg.ConnectionString())
// ... execute SQL
根據(jù)文檔,設(shè)置測試以便容器只啟動一次是個好主意,因為啟動可能需要幾秒鐘(如果需要下載圖像則需要更多時間)。它提出了一些緩解該問題的方法。
- 2 回答
- 0 關(guān)注
- 161 瀏覽
添加回答
舉報