【问题标题】:Assert.AreEqual fails with the same typeAssert.AreEqual 以相同的类型失败
【发布时间】:2012-12-11 17:46:37
【问题描述】:

我正在测试两个对象(以及它们的集合),但即使它们具有相同的类型,它也会失败:

我做了一些研究,这可能是因为参考文献可能有所不同。但是,它仍然是同一类型,我不知道要使用什么 Assert 方法。 (CollectionAssert.AreEquivalent 也失败了)。

已编辑

我也在尝试检查每个字段的值是否相同,在这种情况下,我应该为每个字段执行 Assert.AreEqual 吗?

--谢谢,所有的答案都很有帮助

【问题讨论】:

    标签: c# asp.net .net unit-testing assert


    【解决方案1】:

    您应该比较对象的类型。正如您正确识别的那样,对象的内容可能不同,因此它们不能被视为相等。

    试试类似的东西

    Assert.AreEqual(typeof(ObjectA), typeof(ObjectB))

    【讨论】:

      【解决方案2】:

      Assert.AreEqual 检查两个对象是否相同,而不是它们只是同一类型。要做到这一点,你会这样做:

      Assert.AreEqual(A.GetType(), B.GetType());
      

      【讨论】:

        【解决方案3】:

        如果要比较 dto 对象的值,则必须覆盖 Equals 和 GetHashCode 方法。

        例如给定的类:

        public class DTOPersona
        {
            public string Name { get; set; }
            public string Address { get; set; }
        }
        

        如果您认为具有相同名称(但不是地址)的 DTOPersona 类的两个对象是等效对象(即同一个人),您的代码可能如下所示:

        public class DTOPersona
        {
            public string Name { get; set; }
            public string Address { get; set; }
        
            protected bool Equals(DTOPersona other)
            {
                return string.Equals(Name, other.Name);
            }
        
            public override bool Equals(object obj)
            {
                if (ReferenceEquals(null, obj))
                {
                    return false;
                }
                if (ReferenceEquals(this, obj))
                {
                    return true;
                }
                if (obj.GetType() != this.GetType())
                {
                    return false;
                }
                return Equals((DTOPersona) obj);
            }
        
            public override int GetHashCode()
            {
                return (Name != null ? Name.GetHashCode() : 0);
            }
        }
        

        【讨论】:

        【解决方案4】:

        如果不添加一些比较逻辑,您将无法从数据的角度知道您的类实例是否与另一个相同。

        为了检查所有字段是否具有相同的值,您可以覆盖 Object.GetHashCode 和 Object.Equals 方法。

        逐个字段比较也可以。

        【讨论】:

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