Wenn Sie SQLMock zum Verspotten von Abfragen verwenden, kann es zu Situationen kommen, in denen die erwartete Übereinstimmung nicht mit der Abfrage übereinstimmt, obwohl sie angezeigt wird identisch in der Protokollausgabe. In diesem Artikel werden häufige Gründe für diese Nichtübereinstimmung erläutert und Lösungen bereitgestellt.
Der erste Schritt besteht darin, zu überprüfen, ob Ihre Abfrage tatsächlich mit der erwarteten Abfrage identisch ist. Allerdings können subtile Unterschiede in der Syntax oder der Argumentverarbeitung zu Nichtübereinstimmungen führen.
Ein häufiges Problem tritt bei der Verwendung von Sonderzeichen in der Abfrage auf. SQLMock interpretiert diese Zeichen möglicherweise anders als Ihr Code. Um eine genaue Übereinstimmung sicherzustellen, können Sie die Funktion regexp.QuoteMeta() verwenden, um die Abfragezeichenfolge zu maskieren. Zum Beispiel:
mock.ExpectQuery(regexp.QuoteMeta(`SELECT * FROM "storage_pools" WHERE "storage_pools"."deleted_at" IS NULL AND ((poolid = ?)) ORDER BY "storage_pools"."id" ASC LIMIT 1`))
Dadurch wird sichergestellt, dass alle Sonderzeichen als Literale behandelt werden, wodurch Nichtübereinstimmungen vermieden werden.
Sie haben erwähnt, dass dies bei Select-Anweisungen nicht der Fall ist Arbeiten mit ExpectExec(). Dies liegt daran, dass ExpectExec() eine Update- oder Insert-Anweisung und keine Select-Anweisung erwartet. Verwenden Sie für Select-Anweisungen stattdessen ExpectQuery().
mock.ExpectQuery(`SELECT \* FROM "storage_pools"`). WithArgs(c.givenPool.PoolId).WillReturnResult(sqlmock.NewResult(1, 1))
Das obige ist der detaillierte Inhalt vonWarum stimmt meine SQLMock-Abfrage nicht überein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!