Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `sqlmock` gagal untuk memadankan pertanyaan walaupun pertanyaan adalah sama dan log menunjukkannya adalah sama?

Mengapakah `sqlmock` gagal untuk memadankan pertanyaan walaupun pertanyaan adalah sama dan log menunjukkannya adalah sama?

Susan Sarandon
Susan Sarandonasal
2024-11-08 12:02:01376semak imbas

Why is `sqlmock` failing to match a query even though the queries are identical and the logs show them to be the same?

sqlmock tidak sepadan dengan pertanyaan, tetapi pertanyaan adalah sama dan output log menunjukkan yang sama

Menghadapi isu semasa menulis ujian kod menggunakan Gorm dan sqlmock , terutamanya berkaitan dengan fungsi kemas kini.

Bahagian aliran kerja pertama hanya menanyakan rekod daripada pangkalan data. Walaupun output log menunjukkan ia adalah sama, saya tidak dapat memadankannya dengan SQL saya.

Mesej ralat adalah seperti berikut:

(database.go:263)
[2020-01-08 10:29:40]  查询:无法匹配实际 SQL:“SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC LIMIT 1” with expected regexp "SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC LIMIT 1"

Saya juga cuba menggunakan ExpectExec untuk memasukkan ExpectQuery.

  for _, c := range cases {
    db, mock, err := sqlmock.New()
    if err != nil {
      t.Fatal(err)
    }
    DB, err := gorm.Open("sqlite3", db)
    if err != nil {
      t.Fatal(err)
    }
    DB.LogMode(true)

    mock.ExpectQuery(`SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC LIMIT 1`)

    err = UpdateStoragePool(DB, &c.givenPool)
    if !reflect.DeepEqual(c.wantedError, err) {
      t.Fatalf("expecting errror %q, got %q", c.wantedError, err)
    }

    // 如果事务期间没有发生任何错误,则检查是否满足所有预期
    if c.wantedError == nil {
      if err := mock.ExpectationsWereMet(); err != nil {
        t.Fatalf(err.Error())
      }
    }
  }

Saya juga mencuba:

mock.ExpectQuery(`SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = '1')) ORDER BY "storage_pools"."id" ASC LIMIT 1`).WithArgs(1)  
mock.ExpectExec(`SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC LIMIT 1`)  
mock.ExpectExec(`SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = '1')) ORDER BY "storage_pools"."id" ASC LIMIT 1`).WithArgs(1)

Mungkin ada dua sebab yang mungkin untuk masalah ini:

  1. Cuba letakkan petikan berganda (") dalam rentetan pertanyaan. sqlmock memerlukan backticks (`) dalam rentetan pertanyaan, gantikan petikan berganda dengan backticks. Cuba gunakan ? pemegang tempat dengan $n.

Atas ialah kandungan terperinci Mengapakah `sqlmock` gagal untuk memadankan pertanyaan walaupun pertanyaan adalah sama dan log menunjukkannya adalah sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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