2017-07-28 53 views
0

我在視覺工作室上使用nunit測試v2.6.4,並且遇到了一個奇怪的錯誤。當它在兩個單獨的對象(但是相同類型)ObjOne和ObjTwo上被調用時,錯誤發生在「Assert.AreEqual」上。C#nunit聲明錯誤:期望和是一樣的

如何創建這兩個對象:

* ObjOne與有效字段(名字= 「富」,姓氏= 「酒吧」)

* 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. 有沒有反正我得到這個錯誤的更多信息?

+0

它只是在對象上調用「Equals」。如果你沒有在課堂上重寫它,它會做引用平等。 – juharr

+0

這裏的另一個選擇是聲明類的所有屬性都是相等的。 – juharr

回答

3

TypeTest(後編輯TypeOfObjOneAndTwo)類必須覆蓋bool Equals(object)。否則就不會有「平等」的概念。

注意:System.ValueType確實會覆蓋Equals,如果您改爲使用struct,則這很重要。

如果您想要更好的斷言失敗消息,您也可以覆蓋ToString

+1

我編輯了我的問題來澄清「TypeTest」是ObjOne和ObjTwo的類型。 AHHH等等,如果我在類中覆蓋bool Equals(object),那麼Assert.AreEqual將使用那個? –

+1

@ A.sharif是的,不要忘記也重寫'GetHashCode'。 – juharr

+0

謝謝!這是問題! @Juharr這是一個很好的觀點!我花了一些時間閱讀爲什麼你需要重寫GetHashCode。然而,當我讀它時,我感到困惑,它說,如果一個類改變(可變),那麼你不應該重寫GetHashCode。這是指像一個動態類嗎?還是說,如果你隨時更改類的字段,那麼不要重寫GetHashCode? 。如果你爲這個問題添加一個答案,我也可以upvote。 這是我正在閱讀的鏈接http://www.loganfranken.com/blog/692/overriding-equals-in-c-part-2/ –