我有一个包含这些属性的类:
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会抛出异常。
答案 0 :(得分:6)
您需要覆盖Equals
来比较对象。默认实现比较引用,而不是值。请参阅MSDN documentation。
答案 1 :(得分:3)
因为您需要覆盖Equals
和GetHashCode
:
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