我有一种非常奇怪的行为,我无法解释。
我有以下课程:
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<Project>();
return project;
}
}
我添加了一个单元测试来测试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<Project>(expected, actual);
}
但是当我运行单元测试时,在将两个对象的类型与以下错误进行比较时失败:
Assert.AreEqual失败。预期:其中MyProject.NHibernate.Project取代。 实际:&LT; MyProject.NHibernate.Project&GT;
为什么断言失败?
Assert.AreEqual仅仅对对象的属性断言吗?
根据文件:
Assert.AreEqual方法(对象,对象)
验证两个指定的对象是否相等。断言如果失败则失败 对象不相等。
Assert.AreSame方法
验证指定的对象变量是否引用同一对象。
答案 0 :(得分:25)
您需要覆盖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上查看guidelines for overriding equals。
答案 1 :(得分:8)
确保您的Project
类重写了equals方法。目前您正在比较对象引用,并且由于您有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<Project>(expected, actual);
}
PS:如果你重写等于它advised也覆盖Hashcode。
public override int GetHashCode()
{
var hashcode = Id.GetHashCode();
hashCode ^= Name.GetHashCode();
return hashCode;
}
Assert.AreSame
方法, Equals
仍会失败。该方法实际上检查引用是否指向同一实例。在你的情况下,他们不会。
Assert.AreEqual
只会检查对象是否相等,这将通过调用expected.Equals(actual)
来完成。一旦您实施了override bool Equals()
方法,这将导致真实。
答案 2 :(得分:1)
您正在比较拥有相同数据的两个不同对象。您应该在Project类中重载Equals方法,并在那里通过id实现比较。
答案 3 :(得分:1)
一个简单的替代方案是:
Assert.IsTrue(string1 == string2, "Error");