为什么Assert.AreEqual <t>失败并且具有相同的对象?</t>

时间:2013-11-19 13:31:11

标签: c# assert

我有一个包含这些属性的类:

public class Person
{
    public long Id { get; set; }

    public string Name { get; set; }

    public int? IdCountry { get; set; }
    public virtual Country Country { get; set; }
    public int? IdState { get; set; }
    public virtual State State { get; set; }
}

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int IdCountry { get; set; }
    public virtual Country Country { get; set; }
}

在单元测试中,我创建了两个具有相同值的对象

Person expected = new Person()
{
    Name = "blablablbla",
    Id = 1
};
Person actual = PessoaFactory.Create(Name: "blablablbla", Id: 1);
Assert.AreEqual<Person>(expected, actual);

但Assert.AreEqual会抛出异常。

5 个答案:

答案 0 :(得分:6)

您需要覆盖Equals来比较对象。默认实现比较引用,而不是值。请参阅MSDN documentation

答案 1 :(得分:3)

因为您需要覆盖EqualsGetHashCode

public override bool Equals(object o)
{
    if (!(o is Person)) { return false; }
    return ((Person)o).Id == this.Id;
}

public override int GetHashCode()
{
    return this.Id;
}

Assert.AreEqual<T>使用该类型的默认比较器。该类型的默认比较器是比较哈希码。哈希码不相等。

答案 2 :(得分:2)

因为它正在比较引用而不是其中的实际值。

答案 3 :(得分:2)

您有两个不同的对象引用进行比较。

而是使用Assert.IsTrue(expected.Id == actual.Id)作为示例或覆盖Equals和GetHashCode以便能够比较您的对象

答案 4 :(得分:0)

默认情况下,.Net框架本身不处理深度相等协作,如果没有覆盖该方法,Assert.AreEqual会调用Equals对象上的object.Equals方法。 Object.Equals仅实施参考检查。您应该实现自己的Equals方法,例如:

public override bool Equals(object o)
{
    var cast = o as Person;
    if (cast == null) 
        return false; 
    return cast.Id == this.Id;
}

public override int GetHashCode()
{
    return this.Id;
}

有关详细信息,请查看此MSDN Doc

相关问题