簡體   English   中英

重寫僅在C#中測試所需的Equals和GetHashcode方法的最佳位置

[英]Best place to override Equals and GetHashcode methods only required for testing in C#

我需要重寫Equals()GetHashCode()以便可以在單元測試中比較同一類的兩個對象。

假設我有一個類:生產中的MyClass ,目前對於重寫上述方法沒有特殊要求。

但是,在測試中,我想使用overridden Equals比較它們。 我是不是該:

  1. 直接在MyClass中實現方法

  2. 從保存覆蓋的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM