Maison  >  Article  >  développement back-end  >  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
Susan Sarandonoriginal
2024-11-08 12:02:01376parcourir

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"

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

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)

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