Rumah >pembangunan bahagian belakang >Golang >susunan lajur yang berbeza dan kegagalan ujian

susunan lajur yang berbeza dan kegagalan ujian

王林
王林ke hadapan
2024-02-10 15:20:10442semak imbas

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"`
}

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_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 \(\?,\?,\?,\?,\?\)"

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))))
}

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!

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