ホームページ  >  記事  >  バックエンド開発  >  クエリが同一であり、ログにも同じであることが示されているにもかかわらず、「sqlmock」がクエリとの一致に失敗するのはなぜですか?

クエリが同一であり、ログにも同じであることが示されているにもかかわらず、「sqlmock」がクエリとの一致に失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-08 12:02:01376ブラウズ

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

sqlmock はクエリと一致しませんが、クエリは同じであり、ログ出力も同じです

テストの書き込み中に問題が発生しましたGorm と sqlmock を使用したコード。主に更新関数に関連します。

最初のワークフロー セクションでは、データベースのレコードのみをクエリします。ログ出力ではそれらが同じであることが示されていますが、SQL と一致させることができません。

エラー メッセージは次のとおりです。

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

また、ExpectExec を使用して 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())
      }
    }
  }

私も試してみました:

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)

この問題には 2 つの理由が考えられます:

  1. 二重引用符 (") を入れてみてくださいクエリ文字列。クエリ文字列にバックティック (`) が必要です。これを修正するには、クエリで ? プレースホルダーを使用してください。$n が必要です。これを修正するには、プレースホルダーを $n に置き換えます。

以上がクエリが同一であり、ログにも同じであることが示されているにもかかわらず、「sqlmock」がクエリとの一致に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。