C#nunit断言错误:expect和was是相同的

C#nunit断言错误:expect和was是相同的,c#,visual-studio,unit-testing,nunit,C#,Visual Studio,Unit Testing,Nunit,我在visual Studio上使用nunit测试v2.6.4,遇到了一个奇怪的bug。当在两个单独的对象(但类型相同)ObjOne和ObjTwo上调用“Assert.AreEqual”时,错误就会发生 如何创建这两个对象: *对象是使用有效字段创建的(firstName=“Foo”,lastName=“Bar”) *对象的属性被序列化并存储 *ObjOne的属性被去序列化并放入ObjTwo中 *ObjOne和ObjTwo的字段值相同 然而,当对这两个对象调用“Assert.AreEqual”时

我在visual Studio上使用nunit测试v2.6.4,遇到了一个奇怪的bug。当在两个单独的对象(但类型相同)ObjOne和ObjTwo上调用“Assert.AreEqual”时,错误就会发生

如何创建这两个对象:

*对象是使用有效字段创建的(firstName=“Foo”,lastName=“Bar”)

*对象的属性被序列化并存储

*ObjOne的属性被去序列化并放入ObjTwo中

*ObjOne和ObjTwo的字段值相同

然而,当对这两个对象调用“Assert.AreEqual”时,它返回以下错误

"

在NUnit.Framework.dll中发生类型为“NUnit.Framework.AssertionException”的异常,但未在用户代码中处理
其他信息:预计:
但是:
"

我有三个问题

  • Assert.AreEqual正在检查引用是否相同?或者这些值是相同的?(3.0文档说它检查的是值而不是引用,但我不确定nunit的这个版本。我找不到文档)。由于其他原因,我无法升级nunit的版本

  • Assert.AreEqual是否检查两个对象的公共字段以外的其他值

  • 我是否需要获取有关此错误的更多信息

  • TypeTest
    (编辑
    TypeOfObjOneAndTwo后)类必须重写
    bool Equals(object)
    。否则就不会有“平等”的概念

    注意:
    System.ValueType
    会覆盖
    Equals
    ,如果使用
    struct
    ,这一点很重要

    如果需要更好的断言失败消息,您还可以重写
    ToString

    TypeTest
    (编辑
    TypeOfObjOneAndTwo之后)类必须重写
    bool Equals(object)
    。否则就不会有“平等”的概念

    注意:
    System.ValueType
    会覆盖
    Equals
    ,如果使用
    struct
    ,这一点很重要


    如果您想要更好的断言失败消息,您也可以重写
    ToString

    我编辑了我的问题,以澄清“TypeTest”是ObjOne和ObjTwo的类型。啊,等等,如果我在类中覆盖bool Equals(object),那么Assert.AreEqual将使用这个?@A.sharif Yes,并且不要忘记覆盖
    GetHashCode
    。谢谢!这就是问题所在@朱哈尔:这是一个极好的观点!我花了一些时间阅读了为什么还需要重写GetHashCode。然而,当我读到它时,我感到困惑,它说如果一个类发生了变化(是可变的),那么你就不应该重写GetHashCode。这指的是动态类吗?或者说,如果您随时更改类的字段,那么就不要重写GetHashCode。如果你对这个问题加上一个答案,我也可以投赞成票。下面是我读到的@A.sharif链接,如果您不想为可变类重写
    GetHashCode
    ,因为改变对象(更改用于创建哈希代码的属性的值)将导致哈希代码更改。这是在数据结构中存储对象时出现的问题,这些数据结构使用哈希代码对对象进行索引,如果对象在放入数据结构后发生更改,则会将其丢弃。@juharr我认为大多数类在测试中都会有“更改的属性值”。那么这是否意味着在我的例子中我不应该覆盖GetHashCode?我已经编辑了我的问题,以澄清“TypeTest”是ObjOne和ObjTwo的类型。啊,等等,如果我在类中覆盖bool Equals(object),那么Assert.AreEqual将使用这个?@A.sharif Yes,并且不要忘记覆盖
    GetHashCode
    。谢谢!这就是问题所在@朱哈尔:这是一个极好的观点!我花了一些时间阅读了为什么还需要重写GetHashCode。然而,当我读到它时,我感到困惑,它说如果一个类发生了变化(是可变的),那么你就不应该重写GetHashCode。这指的是动态类吗?或者说,如果您随时更改类的字段,那么就不要重写GetHashCode。如果你对这个问题加上一个答案,我也可以投赞成票。下面是我读到的@A.sharif链接,如果您不想为可变类重写
    GetHashCode
    ,因为改变对象(更改用于创建哈希代码的属性的值)将导致哈希代码更改。这是在数据结构中存储对象时出现的问题,这些数据结构使用哈希代码对对象进行索引,如果对象在放入数据结构后发生更改,则会将其丢弃。@juharr我认为大多数类在测试中都会有“更改的属性值”。那么这是否意味着在我的例子中我不应该重写GetHashCode?它只是对对象调用
    Equals
    。如果没有在类中重写它,它将执行引用相等。这里的另一个选项是断言类的所有属性都相等。它只是对对象调用
    Equals
    。如果没有在类中重写它,它将执行引用相等。这里的另一个选项是断言类的所有属性都相等。
    An exception of type 'NUnit.Framework.AssertionException' occurred in nunit.framework.dll but was not handled in user code
    
    Additional information:   Expected: <NameSpace.TypeOfObjOneAndTwo>
    
      But was:  <NameSpace.TypeOfObjOneAndTwo>