2013-05-03 36 views
0

我有一個.NET類,其中我實現了GetHashCode和Equals。單元測試平等涵蓋所有屬性

雖然我相信我涵蓋了所有的屬性並對這些函數進行了測試,但未來可能會有人添加屬性並忘記將其添加到GetHashCode和Equals函數中。忘記這些函數將導致Equals函數對於由新屬性不同的對象返回true。

我正在尋找一些工具或代碼,我可以在測試代碼中使用,這將循環通過對象的所有現有屬性,並測試是否遺忘了某些東西。

單元測試將是這個樣子:

for each property in TargetType 
    dim instance1 as new TargetType 
    dim instance2 as new TargetType 
    instance1.property=1 
    instance2.property=2 
    Assert.AreNotEqual(instance1,instance2) 
next 

當然的財產分配應該是聰明地使用正確的數據類型

+0

即使上面的代碼爲'Equals'工作,GetHashCode會變得相當複雜(因爲兩個不相等的對象可能具有相同的哈希碼) – 2013-05-03 06:28:15

+0

甚至在Equals上捕獲錯過的屬性總比不好抓住它。我可以希望修復也將包括GetHashCode – 2013-05-03 09:38:18

回答

0

如果您擔心新的屬性添加到您的類,我建議先序列化對象,然後比較結果字符串。

這將確保在應用程序和單元測試中始終考慮所有屬性進行比較。

序列化的輔助方法看起來像下面(我稱之爲this SO線程)

'Meant to be an extension method 
Public Shared Function SerializeObject(Of T)(ByVal input As T) As String 
     Dim xmlSerializer = New XmlSerializer(input.GetType()) 
     Dim textWriter = New StringWriter() 
     xmlSerializer.Serialize(textWriter, input) 
     Return textWriter.ToString() 
End Function 

您可以在您的自定義Equals方法使用上面的方法。 希望這有助於。

+0

這看起來很有趣VB :-) – 2013-05-03 06:26:27

+0

@Damien_The_Unbeliever - 我更喜歡C#,所以首先發布。現在,我已經將它改爲VB.NET:o) – Channs 2013-05-03 06:27:10

+0

所以如果equals返回true,但是XML序列化不同,那麼我知道equals是缺少的東西。好主意!但正如我寫的,我正在尋找一個工具/代碼來做到這一點,並將處理所有的屬性。底線是仍然需要爲兩個實例上的同一個屬性分配不同的值並進行某種匹配(不管它是XML還是這裏或其他地方) – 2013-05-03 09:36:44