【问题标题】:Why does Assert.AreEqual(T obj1, Tobj2) fail with identical objects为什么 Assert.AreEqual(T obj1, Tobj2) 使用相同的对象失败
【发布时间】:2011-10-17 11:26:23
【问题描述】:

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

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。对象是相同的,我已经使用调试器验证了这一点。请分享任何想法。谢谢。

【问题讨论】:

  • 请用您使用的语言标记。
  • 您使用的是哪个单元测试框架?单元?测试?单位?还有什么? (请更新您的标签)。
  • 你在这里比较相同的对象,你确定它失败了吗?
  • @narek:你不是说 Assert.AreEqual(实际,预期)吗?您输入了 Assert.areEqual(expected, expected)
  • 应该是Assert.AreEqual(expected, actual);?

标签: c# unit-testing nunit


【解决方案1】:

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

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

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

【讨论】:

  • 在他给出的例子中,他比较的是同一个变量。
  • 可能他的意思是 Assert.AreEqual(expected, actual) 所以你的答案是正确的
  • 应该是 Assert.AreEqual(expected, actual),很抱歉造成混淆,非常感谢您的回答。
【解决方案2】:

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

【讨论】:

  • ... 并实现 GetHashCode() 以及
【解决方案3】:

假设它应该是Assert.AreEqual(expected, actual);,就像上面cmets中所说的那样:

您必须定义如何比较 NavigationMenuItem 对象。如果它是同一个实例并且显然它们不是那么自信,则它唯一的检查是失败。

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多