我有一个包含几个结构的类:
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。对象是相同的,我已经使用调试器验证了这一点。请分享任何想法。感谢。
答案 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方法并在那里实现比较。