2017-12-08 16 views
0

状況: ユニットテストをしていて、予想されるエラーがあるかどうかをチェックしようとしていました。ゴランのエラーを比較するには

I期待どおりの結果を持っていなかったので、私はエラーを強要するために比較される単純な何かを試してみましたが、私は比較は「偽」を返していることに驚きました

e1 := errors.New("error") 
e2 := errors.New("error") 
fmt.Println(e1 == e2) // false 

実行例:https://play.golang.org/p/cvjjiJT_5T

誰かが私に説明することができますなぜこれが偽を返すとエラー間の平等を正しくチェックする方法?

+3

errors.Newは値へのポインタを返します。 e1/e2は異なる値へのポインタです。等価性テストは、内側の値ではなくポインタのアドレスをチェックするため、必然的にfalseです。これは%#v形式のhttps://play.golang.org/p/Vu5kaBhh6yを使って見ることができます。強く型付けされたエラーを使用し、代わりにアサーションを入力してください。 –

答えて

3

同じエラーメッセージで2つの異なるエラー変数を作成しています。 ==と比較すると、同じ変数ではないため、falseとなります。

エラーメッセージを比較する場合は、e1.Error() == e2.Error()を試してください。しかし、エラーメッセージの比較はまだ良い考えではありません。いくつかのエラー定数(例:e1 == ErrContentNotFound)を作成するか、エラーに何らかのIDを追加して比較することもできます(例:e1.ID == ContentNotFoundID)。詳細については、https://dave.cheney.net/2016/04/07/constant-errors(およびそのリンクの関連記事)を参照してください。