Editor PHP Xinyi di sini untuk memperkenalkan kepada anda masalah tentang Gorm: apabila kami menggunakan Gorm untuk melakukan pertanyaan pangkalan data, pesanan lajur yang berbeza boleh menyebabkan kegagalan ujian. Ini kerana apabila Gorm melakukan pertanyaan, ia akan menjana pernyataan SQL berdasarkan susunan medan dalam struktur. Jika kami menentukan susunan lajur tertentu dalam pertanyaan, tetapi susunan medan dalam struktur tidak sepadan dengannya, ujian akan gagal. Oleh itu, apabila menggunakan Gorm untuk pertanyaan pangkalan data, kita perlu memberi perhatian kepada susunan medan dalam struktur yang konsisten dengan susunan lajur dalam pertanyaan untuk mengelakkan masalah ini.
Dalam kod saya, saya mempunyai model berikut:
type ID uint64 type BaseModel struct { ID ID `gorm:"column:id;primaryKey;autoIncrement" json:"id"` UpdateDate time.Time `gorm:"column:update_date;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"update_date"` CreateDate time.Time `gorm:"column:create_date;default:CURRENT_TIMESTAMP" json:"create_date"` } type Rollback struct { BaseModel PID ID `gorm:"index"` Table string `gorm:"column:tbl_name"` RollbackRow string `gorm:"type:longtext"` }
Saya menggunakan kaedah gorm.DB
结构的 CreateInBatches
.
Saya menggunakan go-sqlmock untuk ujian unit. Dalam model ini, hanya operasi sisipan dilakukan.
func expectRollbackInsert(mock sqlmock.Sqlmock, tablename []string) { args := make([]driver.Value, 0) for _, val := range tablename { args = append(args, 1, val, sqlmock.AnyArg(), sqlmock.AnyArg(), sqlmock.AnyArg()) } mock.ExpectExec(regexp.QuoteMeta("INSERT INTO `rollback` (`payment_id`,`tbl_name`,`rollback_row`,`update_date`,`create_date`) VALUES (?,?,?,?,?)")). WithArgs(args...). WillReturnResult(sqlmock.NewResult(int64(len(tablename)), int64(len(tablename)))) }
Kes ujian saya kadangkala gagal kerana susunan yang berbeza create_date
和 update_date
.
Salah satu kegagalan ialah
ExecQuery: could not match actual sql: "INSERT INTO `rollback` (`pid`,`tbl_name`,`rollback_row`,`create_date`,`update_date`) VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?)" with expected regexp "INSERT INTO `rollback` \(`pid`,`tbl_name`,`rollback_row`,`update_date`,`create_date`\) VALUES \(\?,\?,\?,\?,\?\)"
Untuk kes penggunaan saya, susunan lajur dalam sisipan tidak penting. Bagaimanakah saya boleh mengendalikan ini dalam ujian unit untuk mengendalikan semua senario?
Selepas membaca dokumentasi sqlmock di sini saya mendapat penyelesaian berikut:
func expectRollbackInsert(mock sqlmock.Sqlmock, tablename []string) { args := make([]driver.Value, 0) for _, val := range tablename { args = append(args, 1, val, sqlmock.AnyArg(), sqlmock.AnyArg(), sqlmock.AnyArg()) } mock.ExpectExec(regexp.QuoteMeta("INSERT INTO `rollback`")). WithArgs(args...). WillReturnResult(sqlmock.NewResult(int64(len(tablename)), int64(len(tablename)))) }
Saya memadamkan lajur dan nilai. Dalam kes saya, saya tidak perlu mengambil berat tentang medan create_date
和 update_date
, jadi ia berfungsi dengan baik.
Atas ialah kandungan terperinci susunan lajur yang berbeza dan kegagalan ujian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!