testify でfieldにfunc型を含むstructを assert.Equal
で比較すると、Diffにはなにも表れないがテストは失敗する。
https://github.com/stretchr/testify/issues/1146 によると、ライブラリの都合ではなく Go の仕様としてfunc型の比較はお互いがnilかどうかしかチェックできず、それ以上の比較は行えないとなっている。
funcの名前だけでも比較できればとりあえず十分かなと思ったので、名前を比較する方法を調査する。
testifyでは難しそうなので、 go-cmp を使うことにする。
普通に比較すると失敗する
このように、ポインタのアドレスは同じで見た目的には差分はないのだが、diff ありとして失敗する。
assert.Equal(t, want, got)
としても同じようになる。
Error: Not equal:
expected: &Param{Condition:(func(int) bool)(0x10091e1c0)}
actual : &Param{Condition:(func(int) bool)(0x10091e1c0)}
Diff:
Test: TestParam
go-cmpのカスタムの比較処理を書く
go-cmpでカスタムの比較処理 を書いてあげれば良さそう。
Go reflectパッケージを使って関数名を取得する を応用して、以下のようにした。
これで go test を実行するとテストが通るようになった
改良
もう少し調べたら、sliceの中身はgo-cmpの方で展開してくれるので、Kind() == reflect.Func
の場合のみTransformを行っても問題なかった。
一応、ちゃんと FuncName
が実行されているか確認したところちゃんと通っていた。