2016-07-14 53 views
4

我有一個項目,我正在接收對象作爲DTO,並將它們轉換爲View-Models。爲了做這個轉換,我決定做一些自定義的轉換器來進行一些計算,以便將DTO的屬性轉換爲視圖模型。所有這些都準備好了,並且轉換工作正常後,我想在轉換中添加一些單元測試以使其更加穩定(我知道這不符合TDD,但這是我設法實現的)。如何在單元測試中測試兩個對象的相等性?

問題是當我想要測試,以驗證兩個View的模型

Assert.AreEqual(expected, actual); 

的平等由於沒有任何視圖 - 模型的定義Equals方法,他們將永遠不等於作爲參考。有一些方法我想到了,發現比較這些對象:

  1. 要定義Equals方法。但我不知道定義它是否是一種好的做法,僅用於測試目的。如果我定義它,建議也定義GetHashCode方法,所以我不覺得這個解決方案是最好的。

  2. 我想另一種可能性是實現IEqualityComparer<T>測試項目,比較邏輯從主轉換項目隔離開來,甚至提取到一個第三項目這一點,所以如果有必要的轉換模塊可以在今後使用。這個實現看起來不錯,但我不知道是否值得添加另外一個包含很多類的項目,這些項目也應該進行測試。

  3. 我在Stack Overflow question上發現的第三種方法看起來很有趣,它將序列化兩個對象並比較字符串。問題是我不知道這是否是編程的好習慣。

哪個比較對象最好?我錯過了一些可能更有效的方法嗎?

注意:視圖模型是複雜的對象,我無法改變轉換爲其他技術的方式。

+0

好像你已經概述了優點和缺點 - 我不會相信序列化,除非它們是相同的類型 - 爲什麼兩種具有相同屬性的類型可能有不同的序列化有很多原因。 –

+0

@DStanley他們將永遠是相同的類型,或者現在看來,雖然如果我正在使用泛型類型參數的方法,因爲它是來自「IEqualityComparer」的「Equals」,它接收兩個對象而不是簡單的比較,序列化它們並返回它們的字符串比較?這樣足夠穩定嗎? – meJustAndrew

+0

@DStanley我可以看到你已經投票結束了這個問題,因爲這個問題太廣泛了,但我已經閱讀了幫助中心,意思是太寬泛了,我不認爲這個問題適合那個部分,因爲它的答案不是要求提供一本書的洞內容,甚至不需要很長的答案。請考慮許多其他編程問題可以有多個答案,這很好,但這些都不會使它們太寬泛*。謝謝! – meJustAndrew

回答

2

你的第二個方法是比其他兩個要好得多,因爲它連同保持測試特定的代碼單元測試,還因爲它可以讓你改變你對兩個視圖模型意義相同的定義。

把平等比較器移動到一個單獨的項目中是不值得的,但是:如果你打算分享相等的比較邏輯,那麼你可以把它放到你的對象中。另一方面,如果它只是爲了測試而設計的,那麼你應該將它與測試結合在一起(即使用你的方法#1)。

基於序列化的方法太脆弱了,因爲它依賴於不相關的特徵(即,序列化)來測試您實際正在測試的功能(即轉換)。

3

我真的很喜歡Fluent Assertions的ShouldBeEquivalentTo方法。

actual.ShouldBeEquivalentTo(expected); 

默認情況下,這個「只是工作」,既假設你傳遞在結構上等同的對象,但你可以提供額外的參數來定義你想怎麼它做比較。例如,如果你只是要檢查的對象幾塊的等價性,你可以說:

actual.ShouldBeEquivalentTo(new { 
    expected.Name, 
    expected.Description, 
    expected.Code 
}, options => 
    options.ExcludingMissingMembers);