Assert.AreEqual失败了,但它不应该失败

我有一个非常奇怪的行为,我无法解释。

我有以下课程:

public class Project { public virtual int Id { get; set; } public virtual string Name { get; set; } } 

还有一个返回Project对象的方法:

 public Project GetByName(string Name) { using (ISession session = NHibernateHelper.OpenSession()) { Project project = session.CreateCriteria(typeof(Project)) .Add(Restrictions.Eq("Name", Name)) .UniqueResult(); return project; } } 

我添加了一个unit testing来测试GetByName方法:

 [TestMethod] public void TestGetByName() { IProjectsRepository projectRepository = new ProjectsRepository(); var expected = new Project { Id = 1000, Name = "Project1" }; var actual = projectRepository.GetByName(expected.Name); Assert.AreEqual(expected, actual); } 

但是,当我运行unit testing时,在将两个对象的类型与以下错误进行比较时失败:

Assert.AreEqual失败。 预期:。 实际:。

为什么断言失败了?


是不是Assert.AreEqual仅在对象的属性上断言?

根据文件:

Assert.AreEqual方法(对象,对象)

validation两个指定的对象是否相等。 如果对象不相等,则断言失败。

Assert.AreSame方法

validation指定的对象变量是否引用同一对象。

您需要覆盖equals方法以测试相等性。 默认情况下,它将使用引用比较,并且由于您的预期对象和实际对象位于内存中的不同位置,因此它将失败。 这是你应该尝试的:

 public class Project { public virtual int Id { get; set; } public virtual string Name { get; set; } public override bool Equals(Object obj) { if (obj is Project) { var that = obj as Project; return this.Id == that.Id && this.Name == that.Name; } return false; } } 

您还可以查看MSDN上覆盖equals的指南 。

确保您的Project类重写equals方法。 目前您正在比较对象引用,并且由于您有2个不同的Project对象,因此您的Assert.AreEqual()将失败。

 public class Project { public virtual int Id { get; set; } public virtual string Name { get; set; } public override bool Equals(object o) { var result = false; var project = o as Project; if (project != null) { result = Id == project.Id; result &= Name.Equals(project.Name); return result; } return false; } } 

使用equals方法,您可以使用Assert.AreEqual

 [TestMethod] public void TestGetByName() { IProjectsRepository projectRepository = new ProjectsRepository(); var expected = new Project { Id = 1000, Name = "Project1" }; var actual = projectRepository.GetByName(expected.Name); Assert.AreEqual(expected, actual); } 

PS:如果你要覆盖Equals, 建议也覆盖Hashcode。

  public override int GetHashCode() { var hashcode = Id.GetHashCode(); hashCode ^= Name.GetHashCode(); return hashCode; } 

AreSame与AreEqual

即使覆盖Equals方法, Assert.AreSame仍会失败。 该方法实际检查引用是否指向同一实例。 在你的情况下,他们不会。

Assert.AreEqual将简单地检查对象是否相等,这将通过调用expected.Equals(actual)来完成。 一旦实现了override bool Equals()方法,这将导致true。

您正在比较具有相同数据的两个不同对象。 您应该在Project类中重载Equals方法,并在那里通过id实现比较。

一个简单的替代方案是:

 Assert.IsTrue(string1 == string2, "Error");