Assert.AreEqual失败而它不应该(Assert.AreEqual fails while

2019-07-21 20:08发布

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

我有以下类:

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

验证指定的对象变量指向同一个对象。

Answer 1:

你需要重写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上。



Answer 2:

请确保您的Project类覆盖了equals方法。 目前你是比较对象引用,因为你有2名不同的对象ProjectAssert.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()方法。



Answer 3:

你是比较持有相同数据的两个不同的对象。 你应该重载equals方法在你的项目类,并实现由ID比较有。



Answer 4:

一个简单的替代方法是这样的:

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


文章来源: Assert.AreEqual fails while it shouldn't