为什么Assert.AreEqual(T obj1,Tobj2)失败并且具有相同的对象

时间:2011-10-17 11:26:24

标签: c# unit-testing nunit

我有一个包含几个结构的类:

public class NavigationMenu
{
    public struct NavigationMenuItem
    {
        public bool Enabled { get; set; }
        public int NumberOfPendingOperations { get; set; }
    }

    public NavigationMenuItem SubmitExpenses { get; set; }
    public NavigationMenuItem ManageExpenses { get; set; }
    public NavigationMenuItem SubmitBudgets { get; set; }
    public NavigationMenuItem ManageBudgets { get; set; }
    public NavigationMenuItem AuthorizeExpenses { get; set; }
    public NavigationMenuItem ApproveExpenses { get; set; }
    public NavigationMenuItem PayExpenses { get; set; }
    public NavigationMenuItem BillExpenses { get; set; }
    public NavigationMenuItem ManageReturnedExpenses { get; set; }
    public NavigationMenuItem ManageIncompleteExpenses { get; set; }
    public NavigationMenuItem ManageOrders { get; set; }
    public NavigationMenuItem ApproveBudgets { get; set; }
    public NavigationMenuItem AdministrateSystem { get; set; }
}

在单元测试中,我进行函数调用并比较结果:

NavigationMenu expected = new NavigationMenu();
        expected.SubmitExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true };
        expected.ManageExpenses = new NavigationMenu.NavigationMenuItem { Enabled = true };

        NavigationMenu actual = HomeControllerHelper.GetNavigationMenuByUserRole(userRole);

        Assert.AreEqual(expected, actual);

但是Assert.AreEqual总是抛出AssertFailedException。对象是相同的,我已经使用调试器验证了这一点。请分享任何想法。感谢。

3 个答案:

答案 0 :(得分:6)

调用 Assert.AreEqual(预期,预期)不应该失败。如果您在问题中犯了错误,并且您的意思是 Assert.AreEqual(expected,actual)并且您的HomeControllerHelper.GetNavigationMenuByUserRole返回一个新的NavigationMenu实例,那么对Assert.AreEqual的调用将始终失败,原因您的类型NavigationMenu是一个类,因此是一个引用类型,即使您将实例的属性设置为相同的值。

Assert.AreEqual执行相等性检查,如果两个变量指向同一个引用(aka.ReferenceEqual),而不是两个引用包含相同(属性)值。

如果您的类的两个实例相等,您可以覆盖NavigationMenu类的Equals方法以提供自定义实现。

答案 1 :(得分:3)

假设它应该是Assert.AreEqual(expected, actual);,就像它在评论中一样存在:

您必须定义如何比较NavigationMenuItem个对象。如果它是同一个实例而且它们不是那么坚定,那么它唯一的解决就是必须失败。

答案 2 :(得分:3)

因为您(可能)正在比较对象的两个不同实例,但具有相同的参数。为了使对象“相等”,您需要覆盖对象上的Equals方法并在那里实现比较。