我有一个非常奇怪的行为,我无法解释。
我有以下类:
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>。 实际:<MyProject.NHibernate.Project>。
为什么断言失败?
是不是Assert.AreEqual仅在对象的属性断言?
根据文档:
Assert.AreEqual方法(对象,对象)
验证两个指定的对象相等。 如果对象是不相等的断言失败。
Assert.AreSame方法
验证指定的对象变量指向同一个对象。
你需要重写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;
}
}
您还可以检查出准则忽略equals MSDN上。
请确保您的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<Project>(expected, actual);
}
PS:如果你忽略equals它的建议也覆盖的哈希码。
public override int GetHashCode()
{
var hashcode = Id.GetHashCode();
hashCode ^= Name.GetHashCode();
return hashCode;
}
AreSame VS AreEqual
Assert.AreSame
仍然会失败,甚至当你重写Equals
方法。 这种方法实际上检查,如果引用都指向同一个实例。 而你的情况,他们不会。
Assert.AreEqual
将简单地检查对象是相等的,这将通过调用来完成expected.Equals(actual)
。 这将导致真正的,一旦你实现override bool Equals()
方法。
你是比较持有相同数据的两个不同的对象。 你应该重载equals方法在你的项目类,并实现由ID比较有。
一个简单的替代方法是这样的:
Assert.IsTrue(string1 == string2, "Error");