Assert.AreEqual失败,但不应该

时间:2013-03-17 16:14:22

标签: c# visual-studio-2012 mstest assert

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

我有以下课程:

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方法

     

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

4 个答案:

答案 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;
    }

AreSame vs AreEqual

即使您覆盖Assert.AreSame方法,

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

Assert.AreEqual只会检查对象是否相等,这将通过调用expected.Equals(actual)来完成。一旦您实施了override bool Equals()方法,这将导致真实。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

一个简单的替代方案是:

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