2012-06-21 39 views
5

我使用XUnit框架來測試我的C#代碼。XUnit用於檢查對象相等的斷言

在這個框架中是否有可用的對象比較的斷言方法?我的目的是檢查每個對象的公共和私有成員變量的平等。

我想這些辦法,但很少它的工作原理:

1) bool IsEqual = (Obj1 == Obj2) 
2) Assert.Same(Obj1, Obj2) which I couldnt understand what happens internally 
+1

xUnit中有「深度比較」。您必須爲您的對象實現IEquatable ,然後Assert.Equals才能工作。 – seldary

+1

'Assert.Same()'通過引用進行比較;它斷言「Obj1」和「Obj2」是相同的**對象,而不僅僅是**看起來相同。 – TeaDrivenDev

回答

6

你需要有一個自定義比較來實現這一點,當你比較對象,否則它們是否指的是同一個的基礎上檢查記憶中的對象。要覆蓋此行爲,你需要重寫EqualsGetHashCode方法,然後你可以做:

Assert.True(obj1.Equals(obj2)); 

這裏是一個MSDN頁面ABT重載equals方法:http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

而且容易對這一問題的評論:What's the difference between IEquatable and just overriding Object.Equals()?

+1

我明白,通過實施自定義「Equals」方法,可以執行此項檢查。但有沒有什麼方法可以進行盲字節比較,這將使檢查更容易?這是因爲我最終將在「待測軟件」中實現「Equals」實現,僅用於單元測試。 – inquisitive

+1

我嘗試使用序列化方法將兩個對象轉換爲一個字節數組並且它工作。但它帶有一個限制,即將[serializable]屬性添加到具有私有成員變量的類中。我想這在設計上並不好 – inquisitive

8

我有類似的問題,但幸運的是,隨後,我已經使用

using Newtonsoft.Json; 

所以我只是將它序列化爲json對象,然後比較爲字符串。

var obj1Str = JsonConvert.SerializeObject(obj1); 
var obj2Str = JsonConvert.SerializeObject(obj2); 
Assert.Equal(obj1Str, obj2Str); 
+0

我認爲這比實現Equals方法更有用,因爲我希望我的斷言失敗告訴我有關什麼是錯誤的。理想情況下,我希望有一些東西可以遍歷對象樹並累積關於哪些屬性/子樹不相等並且失敗的信息。 –

+0

@RikkiGibson沒有實現Equals只是正確的方法嗎?只需在等於每個不同的屬性的等於列表中添加例外,然後在最後返回true或拋出所有例外 –

+0

是的,但是按情況做是件麻煩事,這就是爲什麼我傾向於當比較普通的舊對象,基元和集合的樹時,尋找基於反射的解決方案。 –