2009-12-16 43 views
2

標題可能聽起來有點不可思議。請允許我使用示例進行詳細說明。通用單元測試是否符合常規.net接口和重載規則的一致性實現?

Object.Equals函數通常要求a.Equals(a)返回true。除非你在代碼中做了某些事情,否則每個班級都應該遵守這個規則。

所以我們可以編寫一個通用的單元測試來檢查所有可用的類。 (我們可能會排除顯式標記某些屬性的類。)

而不是僅使用Equals,我們還檢查所有IComparer實現的正確行爲,以及您可以想象的任何標準接口。

現在,我的問題是:這是否已經存在?如果沒有,爲什麼這是一個壞主意?

回答

1

我不知道這樣的事情的存在,但它聽起來像一個好主意。

這是基於基於對話的測試和靜態代碼分析的邊界 - 您可以想象這樣的規則寫成自定義代碼分析規則,但將其作爲單元測試編寫可能更容易。

在我們的最新項目中,我們有一些基於約定的測試,它們簡單地遍歷給定程序集中的所有類型,並驗證它是否符合我們的一些約定。人們完全可以想象, Equals方法。

1

我可以想到這個功能丟失的一個原因:它需要創建一個每個類的實例進行測試。現在,有些類不提供默認的構造函數。可能的解決方法:

  1. 我們只檢查都有一個默認的構造函數的類。看起來不錯,但總比沒有好。

  2. 我們可以爲所有非默認構造類實現一個工廠。不確定最好的方式,但我認爲有一個可行的解決方案。

顯然,我們可以排除框架提供的所有類,以減少工作量和問題。

+0

那麼,你總是可以使用AutoFixture來創建類的實例...... http://autofixture.codeplex.com/ – 2009-12-16 13:19:48

+0

是的,我猜這樣的事情會起作用。 – mafu 2009-12-16 13:25:24

+0

+1順便說一句。好答案 :) – 2009-12-16 13:36:08