SQLMock を使用してクエリを模擬する場合、一致するはずのクエリが、表示されているにもかかわらず一致しないという状況が発生することがあります。ログ出力でも同じです。この記事では、この不一致の一般的な理由について説明し、解決策を示します。
最初のステップは、クエリが予想されるクエリと実際に同一であることを確認することです。ただし、構文や引数の処理の微妙な違いによって不一致が生じる可能性があります。
クエリで特殊文字を使用すると、よくある問題が 1 つ発生します。 SQLMock はこれらの文字をコードとは異なる解釈をする可能性があります。完全に一致することを保証するには、regexp.QuoteMeta() 関数を使用してクエリ文字列をエスケープします。例:
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`))
これにより、すべての特殊文字がリテラルとして扱われるようになり、不一致が防止されます。
SELECT ステートメントは使用できないと述べましたが、 ExpectExec() を使って作業します。これは、ExpectExec() が select ステートメントではなく、update または insert ステートメントを想定しているためです。 select ステートメントの場合は、代わりに ExpectQuery() を使用してください。
mock.ExpectQuery(`SELECT \* FROM "storage_pools"`). WithArgs(c.givenPool.PoolId).WillReturnResult(sqlmock.NewResult(1, 1))
以上がSQLMock クエリが一致しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。