私は多くの指示を見てきました (なぜ Assert.AreEqual(T obj1, Tobj2) は同一のオブジェクトで失敗するのですか、ユニットテスト Assert.AreEqual が失敗しました、Assert.AreEqual は同じタイプで失敗しますEquals
) /IEqualityComparer
をチェックしたい場合は、クラスに実装します参照ではなくフィールド値に基づく等価性。
そうしようとして、私はそれを機能させることができず、問題を次のように絞り込みました。
私のクラスのサブジェクトをテストする必要があります。SubjectTestEqualでは、両方のインスタンスが等しいと予想されますが、結果は「Assert.AreEqual が失敗しました。また、コードをデバッグすると、EqualsやGetHashCodeへの呼び出しが表示されません。
不可解な「Default プロパティは、型 T が System.IEquatable インターフェイスを実装しているかどうかをチェックし、実装している場合は、その実装を使用する EqualityComparer を返します。それ以外の場合は、提供された Object.Equals および Object.GetHashCode のオーバーライドを使用する EqualityComparer を返します。時間あたり。" EqualityComparer.Default プロパティのドキュメントでは、IEquatable (効果を確認するためにコードのコメントを解除) も試してみましたが、役に立ちませんでした。
public class Subject : IEqualityComparer<Subject>//, IEquatable<Subject>
{
public int Id { get; set; }
public Subject(int name) { Id = name; }
public bool Equals(Subject x, Subject y)
{ return (x.Id == y.Id); }
public int GetHashCode(Subject obj)
{ return Id; }
//public bool Equals(Subject other)
//{ return Equals(this, other); }
}
[TestClass]
public class SubjectTest
{
[TestMethod]
public void SubjectTestEqual()
{ Assert.AreEqual<Subject>(new Subject(1), new Subject(1)); }
[TestMethod]
public void SubjectTestSame()
{
Subject test = new Subject(1);
Assert.AreEqual<Subject>(test, test);
}
}
誰でもこれに光を当てることができますか?