C#nunit断言错误:expect和was是相同的
我在visual Studio上使用nunit测试v2.6.4,遇到了一个奇怪的bug。当在两个单独的对象(但类型相同)ObjOne和ObjTwo上调用“Assert.AreEqual”时,错误就会发生 如何创建这两个对象: *对象是使用有效字段创建的(firstName=“Foo”,lastName=“Bar”) *对象的属性被序列化并存储 *ObjOne的属性被去序列化并放入ObjTwo中 *ObjOne和ObjTwo的字段值相同 然而,当对这两个对象调用“Assert.AreEqual”时,它返回以下错误 "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”时
在NUnit.Framework.dll中发生类型为“NUnit.Framework.AssertionException”的异常,但未在用户代码中处理
其他信息:预计:
但是:
"
我有三个问题
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>