sharefull/mockfuncを作った

December 23, 2021

年の瀬ですね。

シェアフル株式会社で副業をしておりまして、そこで作成したsharefull/mockfuncについて紹介します。

sharefull/mockfuncはモック用の関数を作るためのパッケージです。テストでモック用の関数を作る際に使わない引数のせいで関数が無駄に長くなってしまったり、どの引数が使われていないのか分かりづらくなったりすることがあると思います。

sharefull/mockfuncパッケージには関数を作成して、変数やフィールドに設定するSet関数があります。Set関数は、第1引数に*testing.T型、第2引数に変数やフィールドへのポインタ、第3引数に関数を渡します。

第3引数の関数では、使用していない引数や戻り値の型としてmockfunc.Unused型を使えるようになっています。また、使わない戻り値にゼロ値を返すために、mockfunc.UnusedValue変数を用いることができます。実際に使う場合は、以下のように_____で置き換えて使うと便利です。

// 不要な引数や戻り値に使用する
type __ = mockfunc.Unused   // 型エイリアス
___ := mockfunc.UnusedValue

type Mock struct {
	DoFunc func(ctx context.Context, id int) (n int, err error)
}

var m Mock
t := new(testing.T) // dummy
// 第1引数のcontext.Contextと第1戻り値は使わない
mockfunc.Set(t, &m.DoFunc, func(_ __, id int) (__, error) {
	if id%2 == 0 {
		return ___, errors.New("error") // ゼロ値とエラーを返す
	}
	return ___, nil // ゼロ値とnilを返す
})

// 0 <nil>
fmt.Println(m.DoFunc(context.Background(), 1))
// 0 error
fmt.Println(m.DoFunc(context.Background(), 2))

使わない引数が複数ある場合はfunc(_, _ __)のようにまとめて書くことができるます。テストに不要な引数や戻り値を_____と書くことで注目を避け、注目してほしい引数や戻り値に集中させることができます。テーブル駆動テストに用いると、テストケースを短く書くことができるため、見やすくなります。

ぜひ、年末年始のテストの大掃除に活用して頂ければと思います!

良いお年を!!