testify の assert.NoError() で fail した場合に処理続行して panic しないために


忙しい人のための結論

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 的になってしまうのがどうもイケてない。
どうにかならんもんか。