いくつかの複雑なオブジェクトを作成しましたが、単体テストを行って正しく動作することを確認しようとしています。これにはいくつかの List(Of T) の比較が含まれるため、CollectionAssert を使用しようとしました。今、私は奇妙なことに遭遇しました。
最初に CollectionAssert.AreEqual を使用して、最初のリストが等しいかどうかを確認しました。この主張は通りました。しかし、簡単にするために、CollectionAssert.AreEqual を使用して、期待されるオブジェクトを正確な順序で作成する必要がないようにしたかったので、それを試し始めました。まったく同じコードでは、CollectionAssert.AreEquivalent が失敗しました。equal は equal よりも緩やかなアサーションであるため、これは奇妙だと思いますよね?次のエラーが表示されます。
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s) of <MyObject>. The actual collection contains 0 occurrence(s).
デバッグを試みましたが、シンボル ファイルのダウンロードを設定したにもかかわらず、.Net フレームワークのデバッグがうまくいきませんでした。そのため、カスタムの Equals 関数に 1 回しか入力されず (true を返す)、アサーションが失敗することがわかりました。どちらのオブジェクトにも 2 つの要素があります。コール スタックは次のとおりです (逆順)。
- コレクションAssert.AreEquivalent
- CollectionAssert.AreEquivalent(オーバーロード)
- CollectionAssert.FindMisMatchedElement
- Generic.Dictionary(Of Object, int).TryGetValue
- Generic.Dictionary(Of Object, int).FindEntry
- Generic.ObjectEqualityComparer.Equals
- 私のカスタム Equals
これを書いている今、アイデアが思い浮かび、潜在的な問題があることがわかりました。内部的に Dictionary を使用していることがわかります。int が実際のリストのインデックスである場合、これはおそらくある種のハッシュマップとして機能しますか? これは、equals をオーバーライドするのではなく、カスタム IEqualityComparer を実装する必要があるということですか? そして、私の getHashCode() はどのように見えるでしょうか? (辞書のキーに使用される可能性があると思うので、これは非常に重要だと思いますか?)