Rumah >pembangunan bahagian belakang >Golang >Menguji dengan gorm dan sqlmock
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?
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 (expectbegin
和 expectcommit
围绕删除),查询是使用参数进行的(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!