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

Nar*_*rek 8 c# nunit unit-testing

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

Jeh*_*hof 6

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

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

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