Maison >développement back-end >Golang >Pourquoi mon Sqlmock ne correspond-il pas à ma requête malgré une entrée et une sortie de journal identiques ?

Pourquoi mon Sqlmock ne correspond-il pas à ma requête malgré une entrée et une sortie de journal identiques ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-11 00:57:03808parcourir

Why Is My Sqlmock Not Matching My Query Despite Identical Input and Log Output?

Sqlmock ne correspond pas à la requête malgré une entrée et une sortie de journal identiques

Problème d'incompatibilité de requête

Lorsque vous essayez d'écrire des tests pour une fonction Gorm à l'aide de sqlmock, vous peut rencontrer un problème où sqlmock ne parvient pas à correspondre à votre requête SQL, même si la sortie du journal affiche des requêtes identiques. Cette incompatibilité peut se produire lors de l'utilisation de la méthode ExpectQuery.

Solution

Pour résoudre ce problème, il est recommandé d'utiliser regexp.QuoteMeta() pour échapper à votre requête avant de la transmettre à la méthode ExpectQuery. Cette fonction échappera correctement à tous les caractères spéciaux susceptibles d'être à l'origine de l'incompatibilité. Le code mis à jour ressemblerait à ceci :

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

Problème de non-concordance d'exécution

Vous pouvez également rencontrer un autre problème où sqlmock ne correspondra pas à votre instruction SELECT. En effet, Gorm exécute plusieurs instructions SELECT pour une raison quelconque. La première instruction trouvera la ligne, mais pas la deuxième instruction.

Pour résoudre ce problème, vous pouvez utiliser QueryMatcherOption(sqlmock.QueryMatcherEqual) en conjonction avec ExpectQuery pour forcer sqlmock à utiliser une correspondance de chaîne exacte au lieu de sa algorithme de correspondance plus flou par défaut.

db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
if err != nil {
    t.Fatal(err)
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn