第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單元測試 Postgres 數(shù)據(jù)庫連接 golang

單元測試 Postgres 數(shù)據(jù)庫連接 golang

Go
絕地?zé)o雙 2022-07-18 16:21:16
即使是為了推動基本的項目結(jié)構(gòu),我也應(yīng)該有 80% 的測試覆蓋率。我有點困惑如何為以下代碼編寫單元測試以連接到 postgres db 并 ping postgres 進行健康檢查。有人能幫助我嗎。var postgres *sql.DB// ConnectToPostgres func to connect to postgresfunc ConnectToPostgres(connStr string) (*sql.DB, error) {    db, err := sql.Open("postgres", connStr)    if err != nil {        log.Println("postgres-client ", err)        return nil, err    }    postgres = db    return db, nil}// PostgresHealthCheck to ping database and check for errorsfunc PostgresHealthCheck() error {    if err := postgres.Ping(); err != nil {        return err    }    return nil}type PostgresRepo struct {    db *sql.DB}// NewPostgresRepo 構(gòu)造函數(shù)func NewPostgresRepo(database *sql.DB) *PostgresRepo {    return &PostgresRepo{        db: database,    }}
查看完整描述

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

}


查看完整回答
反對 回復(fù) 2022-07-18
?
慕蓋茨4494581

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è)置測試以便容器只啟動一次是個好主意,因為啟動可能需要幾秒鐘(如果需要下載圖像則需要更多時間)。它提出了一些緩解該問題的方法。


查看完整回答
反對 回復(fù) 2022-07-18
  • 2 回答
  • 0 關(guān)注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號