【问题标题】:C# nunit assertion error: expect and was are the sameC# nunit 断言错误:expect 和 was 相同
【发布时间】:2018-01-04 20:47:59
【问题描述】:

我在视觉工作室上使用 nunit testing v2.6.4 并且遇到了一个奇怪的错误。当在两个单独的对象(但类型相同)ObjOne 和 ObjTwo 上调用“Assert.AreEqual”时,该错误会发生。

这两个对象是如何创建的:

*ObjOne 是使用有效字段创建的 (firstName = "Foo", lastName = "Bar")

*ObjOne 的属性被序列化和存储。

*ObjOne 的属性被反序列化后放入 ObjTwo。

*ObjOne 和 ObjTwo 的字段具有相同的值。

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

"

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>

"

我有三个问题。

  1. 是否 Assert.AreEqual 检查引用是否相同?还是价值观相同? (3.0 文档 here 说它检查的是值而不是参考,但我不确定这个版本的 nunit。我找不到文档)。由于其他因素,我无法升级nunit的版本。

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

  3. 我是否可以获取有关此错误的更多信息?

【问题讨论】:

  • 它只是在对象上调用Equals。如果您没有在类中覆盖它,它将执行引用相等。
  • 这里的另一个选项是断言类的所有属性都是相等的。

标签: c# visual-studio unit-testing nunit


【解决方案1】:

TypeTest(编辑后TypeOfObjOneAndTwo)类必须覆盖bool Equals(object)。否则就不会有“相等”的概念。

注意:System.ValueType 确实会覆盖 Equals,如果您改用 struct,这很重要。

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

【讨论】:

  • 我已经编辑了我的问题,以澄清“TypeTest”是 ObjOne 和 ObjTwo 的类型。 AHHH 等等,如果我在类中覆盖 bool Equals(object),那么 Assert.AreEqual 会使用那个吗?
  • @A.sharif 是的,别忘了也覆盖GetHashCode
  • 谢谢!这就是问题所在! @Juharr 这是一个很好的观点!我花了一些时间阅读为什么还需要覆盖 GetHashCode。但是当我读到它时我很困惑,它说如果一个类发生了变化(是可变的),那么你不应该覆盖 GetHashCode。这指的是动态类吗?还是说如果您随时更改类的字段然后不要覆盖GetHashCode? .如果您对此问题添加答案,我也可以投票。这是我正在阅读的链接loganfranken.com/blog/692/overriding-equals-in-c-part-2
  • @A.sharif 您不想为可变类覆盖GetHashCode,因为改变对象(更改用于创建哈希码的属性的值)会导致哈希要更改的代码。当将对象存储在使用哈希码对其进行索引的数据结构中时,这是一个问题,因此如果它在放入数据结构后发生更改,则会将其丢弃。
  • @juharr 我想大多数类在测试中都会“改变属性值”。那么这是否意味着我不应该在我的情况下覆盖 GetHashCode?​​span>
猜你喜欢
  • 2011-06-27
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多