Heim  >  Artikel  >  Backend-Entwicklung  >  Warum findet „sqlmock' keine Übereinstimmung mit einer Abfrage, obwohl die Abfragen identisch sind und die Protokolle zeigen, dass sie gleich sind?

Warum findet „sqlmock' keine Übereinstimmung mit einer Abfrage, obwohl die Abfragen identisch sind und die Protokolle zeigen, dass sie gleich sind?

Susan Sarandon
Susan SarandonOriginal
2024-11-08 12:02:01462Durchsuche

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

sqlmock stimmt nicht mit der Abfrage überein, aber die Abfrage ist dieselbe und die Protokollausgabe zeigt dasselbe.

Beim Schreiben des Tests ist ein Problem aufgetreten Code mit Gorm und sqlmock, hauptsächlich im Zusammenhang mit der Update-Funktion.

Der erste Workflow-Abschnitt fragt nur Datensätze aus der Datenbank ab. Auch wenn die Protokollausgabe zeigt, dass sie gleich sind, kann ich sie nicht mit meinem SQL-Code abgleichen.

Die Fehlermeldung lautet wie folgt:

(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"

Ich habe auch versucht, ExpectExec zum Einfügen von ExpectQuery zu verwenden.

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

Ich habe es auch versucht:

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)

Es kann zwei mögliche Gründe für dieses Problem geben:

  1. Versuchen Sie, doppelte Anführungszeichen (") einzufügen Die Abfragezeichenfolge erfordert Backticks (`), um dies zu beheben. Versuchen Sie, den Platzhalter „?“ in der Abfrage zu verwenden der ?-Platzhalter mit $n.

Das obige ist der detaillierte Inhalt vonWarum findet „sqlmock' keine Übereinstimmung mit einer Abfrage, obwohl die Abfragen identisch sind und die Protokolle zeigen, dass sie gleich sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn