前提
ORMにgormを使っていて、sqlmockでテストを書いている。
概要
gormはレコードの更新時にupdated_atカラムを自動で更新してくれる。
sqlmockでテストを書くときに期待するクエリを正規表現で書くが、updated_atはどのような値で更新されるかあらかじめ知ることができないため、期待するクエリと実行されたクエリが不一致となりテストに失敗してしまう。
エラー出力
does not match actual [time.Time - 2019-11-15 06:29:27.8173492 +0000 UTC m=+0.006968701]"}
↑の例はupdated_atの期待する戻り値として、time.Now()と指定した結果。
方法
example.go
type AnyTime struct{}
func (a AnyTime) Match(v driver.Value) bool {
_, ok := v.(time.Time)
return ok
}
func TestExample(t *testing.T) {
db, mock, err := New()
if err != nil {
// error
}
mock.ExpectExec(regexp.QuoteMeta("UPDATE `users` SET `name` = ? `updated_at` = ? WHERE `users`.`id` = ?")).
WithArgs("田中太郎", AnyTime{}, 1).
WillReturnResult(NewResult(1, 1))
}
↑の例は諸々省略しているものの、伝えたいことは、以下の通り。
- AnyTime{}を定義する
- Matchを定義する
- WithArgsのupdated_atでAnyTime{}を指定する
作成の際も同様。