作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含多个结构的类:
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。对象是相同的,我已经使用调试器验证了这一点。请分享任何想法。谢谢。
最佳答案
Assert.AreEqual(expected, expected) 调用不应失败。如果您在问题中犯了错误并且您的意思是 Assert.AreEqual(expected, actual) 并且您的 HomeControllerHelper.GetNavigationMenuByUserRole 返回了 NavigationMenu 的新实例,那么对 Assert.AreEqual 的调用总是会失败,原因您的类型 NavigationMenu 是一个类,因此是一个引用类型,即使您将实例的属性设置为相同的值也是如此。
如果两个变量指向相同的引用(也称为 ReferenceEqual)而不是如果两个引用包含相同的(属性)值,则 Assert.AreEqual 执行相等性检查。
如果您的类的两个实例相等,您可以覆盖 NavigationMenu 类的 Equals 方法以提供自定义实现。
关于c# - 为什么 Assert.AreEqual(T obj1, Tobj2) 会因相同的对象而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793065/
我是一名优秀的程序员,十分优秀!