2013-07-02 101 views
0

我已經創建了一個自定義的相等比較器,並針對比較器運行了相應的測試。如何模擬CustomEqualityComparer

現在我試圖嘲笑它,以便使用比較器測試的類不必傳遞真實的東西。

我的方法調用看起來像:

left.Except(right, customEqualityComparer); 

當變量「左」和「右」是任何類型的兩個列表和customEqualityComparer是我的自定義相等比較。

我的問題是,我不知道如何模擬customEqualityComparer,因爲它仍然以現實的方式行事。

我正在考慮創建一個包含該方法的類:

public List<object> LeftExceptRight(customEqualityComparer, left, right){} 

而嘲諷的整個方法。這是否過分矯枉過正?我看不到任何其他的替代品..

+0

說你的比較器是'CustomComparer',你的類是否有直接的依賴關係(即調用'new CustomComparer()')或者通過接口獲得它('IComparer ')? –

回答

1

這是矯枉過正?

聽起來像是給我的。爲什麼你想嘲笑你的比較器呢?它是否在測試方面做了特別困難的事情,例如使用外部Web服務或數據庫? (這將是不尋常的。)

只要你的比較器也在本身進行了徹底的測試,我發現在測試中將它用於現實中的任何事情都沒有問題。實際上,嘲笑它沒有任何顯着的好處 - 事實恰恰相反。當你在你的測試中使用它時,你將會有效地測試調用代碼和比較器之間的集成,以及它們一起工作,而不僅僅是一個。

我知道有些人堅持認爲單元測試確實需要一次只測試一個類的代碼......但實用主義讓我相信,雖然嘲笑在許多情況下非常有價值,但很容易過度使用它 - 而僅僅使用真正實現的簡單方法往往是要走的路。

+0

CustomEqualityComparer將只用於left.except(右),right.except(左)和list1.Intersect(list2)。如果我要爲構造函數中的CustomEqualityComparer的3個方法創建包裝類,您認爲它會保證它是自己的測試嗎?這樣整個模塊將完全可插拔。 – SamuelDavis

+1

@SamuelDavis:我敢說 - 但這並不意味着你不能在其他班級的考試中使用它。你認爲你從嘲笑中得到什麼好處? –

+0

對不起,意外按下'輸入',而只輸入了我的評論的一半。你能否重讀我的最初答覆?如果我有一個測試過的'自定義列表擴展'類,它可以在更多的項目中使用。 – SamuelDavis