Goの不透明でないエラー値を比較するためのベストプラクティスはありますか?不透明でないエラー値のテスト
ほとんどのコードベースは、エラーを不透明なものとして扱います(操作が成功したか失敗したか、エラーの原因に関する内部の詳細は表示されません)。
これにより、ユニットテストを簡単に作成できます。これは、予想されるエラーに対して実際のエラーをアサートするだけでよいからです。私が人々にしたことのほとんどは、エラー文字列を比較して、少なくともいくつかの重要な情報が含まれていることを確認することです。たとえば、次のように
if err == nil || !strings.Contains(err.Error(), "not found in the Raft configuration") {
t.Fatalf("err: %v", err)
}
しかし、(無効なフィールド名、値、エラーコードとおそらくいくつかのネストされたエラーすぎを指定する必要がフォーム検証のように)追加のエラー情報が必要な場合のために
、どのようなあなたはしますか?私は単純にreflect.DeepEqual()
を実行することはできません。エラーには毎回比較が失敗するユニークなスタックトレースが含まれているためです。また、ネストされたエラーがあると、テストロジックがさらに複雑になり、必要なフィールドを比較するためにあらゆる種類のエラーが発生しやすいロジック(ループ、再帰)が必要になります。この性質のエラーをテストする標準的な方法はありますか?
あなたは彼らが設定されたことを確認するために自分の存在を確認することができ、「決定論的」ではありませんこれらの値は、その後、彼らのゼロ値( '「」'、 'nil'などにそれらを設定します)残りを 'reflect.DeepEqual'に渡します。理想的ではありませんが、機能します。 – mkopriva