LoginSignup
3
0

More than 3 years have passed since last update.

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

Posted at

忙しい人のための結論

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

3
0
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
3
0