Maison > développement back-end > Golang > Pourquoi « sqlmock » ne parvient-il pas à correspondre à une requête même si les requêtes sont identiques et que les journaux montrent qu'elles sont identiques ?

Pourquoi « sqlmock » ne parvient-il pas à correspondre à une requête même si les requêtes sont identiques et que les journaux montrent qu'elles sont identiques ?

Susan Sarandon
Libérer: 2024-11-08 12:02:01
original
552 Les gens l'ont consulté

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

sqlmock ne correspond pas à la requête, mais la requête est la même et la sortie du journal affiche la même chose

J'ai rencontré un problème lors de l'écriture du test code utilisant Gorm et sqlmock , principalement lié à la fonction de mise à jour.

La première section de workflow interroge uniquement les enregistrements de la base de données. Même si la sortie du journal montre qu'ils sont identiques, je n'arrive pas à le faire correspondre à mon SQL.

Le message d'erreur est le suivant :

(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"
Copier après la connexion

J'ai également essayé d'utiliser ExpectExec pour insérer 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())
      }
    }
  }
Copier après la connexion

J'ai aussi essayé :

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)
Copier après la connexion

Il peut y avoir deux raisons possibles à ce problème :

  1. Essayez de mettre des guillemets doubles ("") dans la chaîne de requête. sqlmock nécessite des backticks (`) dans la chaîne de requête. Pour résoudre ce problème, remplacez les guillemets doubles par des backticks. l'espace réservé ? avec $n.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal