susunan lajur yang berbeza dan kegagalan ujian

王林
Lepaskan: 2024-02-10 15:20:10
ke hadapan
412 orang telah melayarinya

Gorm 不同的列顺序和测试失败

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.

Kandungan soalan

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"`
}
Salin selepas log masuk

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))))
}
Salin selepas log masuk

Kes ujian saya kadangkala gagal kerana susunan yang berbeza create_dateupdate_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 \(\?,\?,\?,\?,\?\)"
Salin selepas log masuk

Untuk kes penggunaan saya, susunan lajur dalam sisipan tidak penting. Bagaimanakah saya boleh mengendalikan ini dalam ujian unit untuk mengendalikan semua senario?

Penyelesaian

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))))
}
Salin selepas log masuk

Saya memadamkan lajur dan nilai. Dalam kes saya, saya tidak perlu mengambil berat tentang medan create_dateupdate_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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!