Rumah >pembangunan bahagian belakang >Golang >Menguji dengan gorm dan sqlmock

Menguji dengan gorm dan sqlmock

王林
王林ke hadapan
2024-02-05 21:39:091171semak imbas

使用 gorm 和 sqlmock 进行测试

Kandungan soalan

Saya cuba menulis ujian untuk fungsi go lambda saya menggunakan sqlmock dan gorm.

Ini adalah ciri yang saya ingin uji:

func docleanup(con *gorm.db) {
    sixmonthsago := time.now().adddate(0, -6, 0).format("2006-02-01")
    con.where("date_to <= ?", sixmonthsago).delete(&availability{})
    con.where("date_to <= ?", sixmonthsago).delete(&reservation{})
}

Ini adalah ujian saya:

func testdocleanup(m *testing.t) {
    var mock sqlmock.sqlmock
    var db *sql.db
    var err error

    db, mock, err = sqlmock.new()
    assert.nil(m, err)

    dialector := mysql.new(mysql.config{
        dsn:                       "sqlmock_db_0",
        drivername:                "mysql",
        conn:                      db,
        skipinitializewithversion: true,
    })

    conn, err := gorm.open(dialector, &gorm.config{})
    if err != nil {
        m.errorf("failed to open connection to db: %v", err)
    }

    if conn == nil {
        m.error("failed to open connection to db: conn is nil")
    }

    defer db.close()

    mock.expectquery(fmt.sprintf("delete from availability where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))
    mock.expectquery(fmt.sprintf("delete from reservations where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))

    docleanup(conn)

    err = mock.expectationsweremet()
    assert.nil(m, err)

}

Saya tidak tahu apa salah saya. Ini adalah kali pertama saya menggunakan sqlmock. Saya telah membaca beberapa tempat dan kod saya kelihatan baik tetapi saya tidak mendapat hasilnya. Kesilapan saya ialah:

Expected nil, but got: &errors.errorString{s:"there is a remaining expectation which was not matched: ExpectedQuery => expecting Query, QueryContext or QueryRow which:\n  - matches sql: 'DELETE FROM availability WHERE date_to <= '2022-13-06''\n  - is without arguments"}

Ada idea apa yang saya buat salah?


Jawapan betul


Masalah utama yang saya lihat ialah dengan cara anda menjangkakan pertanyaan itu. bukannya

    mock.expectquery(fmt.sprintf("delete from availability where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))

Anda sepatutnya mempunyai:

    mock.expectbegin()
    mock.expectexec("delete from `availability` where date_to <= ?").
        withargs(time.now().adddate(0, -6, 0).format("2006-02-01")).
        willreturnresult(sqlmock.newresult(0, 0))
    mock.expectcommit()

Ini akan memberitahu simulasi bahawa anda sedang menggunakan transaksi (expectbeginexpectcommit 围绕删除),查询是使用参数进行的(withargs),以及查询的返回结果是什么(willreturnresult)

Terdapat beberapa perubahan halus lain, seperti `` di sekeliling nama jadual (idiom mysql) dan nama jadual (gorm biasanya akan menjamu nama, jadi anda sama ada dalam availability 上实现 tablename atau lalai kepada ketersediaan).

Cara terbaik untuk melihat semua isu ini ialah menukar docleanup untuk mengembalikan ralat dan kemudian melihatnya dalam ujian anda:

func docleanup(con *gorm.db) error {
    sixmonthsago := time.now().adddate(0, -6, 0).format("2006-02-01")
    tx := con.where("date_to <= ?", sixmonthsago).delete(&availability{})
    if tx.error != nil {
        return tx.error
    }
    tx = con.where("date_to <= ?", sixmonthsago).delete(&reservation{})
    if tx.error != nil {
        return tx.error
    }
    return nil
}
...
    err = docleanup(conn)
    assert.nil(m, err)
...

Lakukan ini dan gunakan kod semasa dan anda akan mendapat

Expected nil, but got: &errors.errorString{s:"call to database transaction Begin, was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:\n  - matches sql: 'DELETE FROM availability WHERE date_to <= '2022-13-06''\n  - is without arguments"}

Ini memberitahu anda bahawa sqlmock tidak menjangkakan permulaan, dan dengan membetulkan bahawa anda akan mendapat ralat lain yang ditangani dalam bahagian pertama jawapan ini.

Atas ialah kandungan terperinci Menguji dengan gorm dan sqlmock. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam