🥡

[Go] sqlmockの使い方備忘録

2022/03/14に公開

初めに

Goでテストケースを書く時に、sqlのMockを作りたい時があります。
今回sqlmockを使ってMockを作ってみましたが、自分が詰まったところをまとめてみました。

基本的な使い方

こちらの記事を参考にしました。大変勉強になりました。
https://qiita.com/gold-kou/items/cb174690397f651e2d7f

正規表現の部分

mock.ExpectQuery(regexp.QuoteMeta(`SELECT id, user_name FROM users WHERE user_name=$1`)).
	WithArgs(1, "uesr").
	WillReturnRows(
		sqlmock.NewRows([]string{"id", "user_name"}).
		AddRow(1, "user"))

type user struct {
	id   int
	user string
}

err = Db.QueryRow("SELECT id, user_name FROM users WHERE user_name=$1", username).
	Scan(&u.id, &u.user)

ここで、mock.ExpectQuery()で書かれたクエリは、Db.QueryRow()で書かれたクエリと一致した時に、WillReturnRows()で書かれた内容が返ってくる。
逆にクエリが同じじゃないとエラーが吐かれる。

mock.ExpectQuery()のクエリが正規表現に対応しているので、より柔軟にいろんなクエリ文のMockを作ることができる。

https://go.dev/play/p/rkKB-YzvH_g

Discussion