忙しい人のための結論
assert.NoError()
で failした際には t.FailNow()
すべし
Why
goのテストコード書く場合いちいち if err != nil
でチェックするのが面倒なのでtestifyの assert.NoError()
を使ってチェックすることがあると思います。
t.Run("hoge func1", func(t *testing.T) {
hoge := NewHoge()
result, err := hoge.func1() // return (interface{}, error)
assert.NoError(t, err)
actual := result.(*Hoge)
expected := &Hoge{Hoge: "hoge"}
assert.Equal(t, expected, actual)
})
上記のテストコードはassertが通っている場合は問題なく動作しますが
assertがfailした場合 assert.NoError
で処理が止まらずにresult.(*Hoge)
で panic したりします。
どちらにせよ失敗しているのでtest的には問題ないですが、test内でpanicするとfailの原因探るのが面倒です。
What
assert.NoError
は assertにfailした際に戻り値(bool)にfalseを返すので
falseの場合は t.FailNow()
を呼んでtestを中断してあげます。
t.Run("hoge func1", func(t *testing.T) {
hoge := NewHoge()
result, err := hoge.func1() // return (interface{}, error)
if !assert.NoError(t, err) {
t.FailNow()
}
actual := result.(*Hoge)
expected := &Hoge{Hoge: "hoge"}
assert.Equal(t, expected, actual)
})
testにfailした際、上手い具合に目的のErrorだけ吐いて止まってくれます。
結局 if err != nil
的になってしまうのがどうもイケてない。
どうにかならんもんか。