[英]Best place to override Equals and GetHashcode methods only required for testing in C#
我需要重寫Equals()
和GetHashCode()
以便可以在單元測試中比較同一類的兩個對象。
假設我有一個類:生產中的MyClass
,目前對於重寫上述方法沒有特殊要求。
但是,在測試中,我想使用overridden Equals
比較它們。 我是不是該:
直接在MyClass中實現方法
從保存覆蓋的MyClass創建一個派生類,然后在我的測試中適當地投射MyClass的實例:
//獲取預期的MyClass的實例
//獲取實際MyClass的實例
Assert.AreEqual((TestMyClass)expected,(TestMyClass)actual);
我傾向於選擇2,因為我認為它可以使生產代碼更整潔。 它還將允許將來直接在MyClass
上進行特定於業務邏輯的重寫,如果MyClass
,這樣做可能會與我在測試中所做的方式不同。
我想缺點是測試和測試項目變得更加復雜。
首選方法是什么?
我建議在您的測試項目中實現IEqualityComparer<T>
接口。 .NET還注意到此接口用於某些集合類和LINQ中的自定義相等性比較。
您有一個選擇,在自定義斷言中執行所需的相等邏輯。
選項1將代碼添加到您的類中,這對於您的業務邏輯是不需要的,但是它可能會添加新的錯誤。 考慮一下使用相等和哈希碼的linq操作。 因此,您的班級會有不良行為。 選項2的工作量很大。 而且在單元測試中您將遇到維護問題。 除此之外,您還將測試不同的類作為生產代碼。 您可能正在測試的代碼完全正常,而在生產環境中卻沒有代碼。
我將使用派生的TestMyClass選項來簡化生產代碼。 但是我不相信您能夠將MyClass對象轉換為TestMyClass對象,相反,您極有可能需要使用將MyClass作為參數的構造函數來創建TestMyClass的新實例。
創建一個擴展方法,並在測試項目中使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.