LoginSignup
12
2

More than 3 years have passed since last update.

【Go】sqlmockでupdated_atやcreated_atなどのtimestampにマッチさせる方法

Posted at

前提

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{}を指定する

作成の際も同様。

参考記事

12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2