如果我想检查,我已经看到了许多说明(为什么 Assert.AreEqual(T obj1, Tobj2) 因相同的对象而失败,单元测试 Assert.AreEqual 失败,Assert.AreEqual 因相同的类型而失败)来为我的类实现Equals
/IEqualityComparer
基于字段值而不是参考的相等性。
为了尝试这样做,我无法让它工作并将问题缩小到以下问题。
我的班级主题需要测试。在SubjectTestEqual中,我希望两个实例相等,但结果是“Assert.AreEqual 失败。此外,如果我调试代码,我看不到对Equals和GetHashCode的调用。
基于神秘的“默认属性检查类型 T 是否实现 System.IEquatable 接口,如果是,则返回使用该实现的 EqualityComparer。否则,它返回使用提供的 Object.Equals 和 Object.GetHashCode 的覆盖的 EqualityComparer由 T。” 在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);
}
}
任何人都可以对此有所了解吗?