【发布时间】:2013-03-06 15:48:08
【问题描述】:
如果我想根据字段值而不是参考来检查相等性,我已经看到许多指令(Why does Assert.AreEqual(T obj1, Tobj2) fail with identical objects、Unit Test Assert.AreEqual failed、Assert.AreEqual fails with the same type)来为我的类实现Equals/IEqualityComparer。
在尝试这样做时,我无法让它工作,并将问题缩小到以下问题。
我的班级主题需要测试。在 SubjectTestEqual 中,我希望两个实例相等,但结果是“Assert.AreEqual 失败。此外,如果我调试代码,我看不到对 Equals 的调用也不是 GetHashCode。
基于神秘的“默认属性检查类型 T 是否实现 System.IEquatable 接口,如果是,则返回一个使用该实现的 EqualityComparer。否则,它返回一个使用 Object.Equals 和 Object 覆盖的 EqualityComparer .GetHashCode 由 T 提供。”在EqualityComparer.Default Property documentation中,我也试过用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);
}
}
任何人都可以对此有所了解吗?
【问题讨论】:
-
根据其他答案,我想出了某种答案。见下文。