2010-03-23 31 views
5

我是整個單元測試的新手,所以請原諒我缺乏經驗。我讀過很多材料,說沒有測試應該依賴於其他測試,即單元測試是完全獨立的。你真的可以這樣做嗎?我有以下的例子:我有幾個實體類相互依賴,基於特定的數據庫模式(我使用Linq到SQL來生成它們)現在,如果我想測試每個模型類,我必須構建模型類的一個對象,構建它的每個依賴關係的測試對象,將它們分配給對象的屬性,然後在檢查上下文並聲明它實際工作之前堅持對象。模型單元測試可以真正獨立,並且[ASP.NET MVC]

這顯然使得測試不相互依賴,或者不以特定順序運行(我沒有在至少有一個類型的實例之前創建的內容類型的實例ContentType)至少在模型級別上存在依賴關係,無法避免。

請批評我很多,如果你認爲我錯了。我想學習。

P.S.只要提到我正在開發ASP.NET MVC應用程序並使用NUnit進行測試(如果有意義的話)

回答

1

是的,單元測試應該(並且可以)是獨立的。你描述的問題是關於依賴性。應該使用依賴注入框架來解決依賴關係(請參閱AutoFac,Ninject項目)。

另一件事是你的數據庫應該使用模擬對象來模擬(參見Moq,Rhino Mocks項目)。即使您的數據庫已被刪除,您也需要測試所有代碼。

其他的事情是,單元測試應該只測試一個功能並不是所有的過程。

1

這裏描述的不是單元測試,而是集成測試。由於應用程序的數據模型與數據庫緊密結合,因此您的測試可能會測試數據庫功能,而不是「數據模型」。

這非常好 - 只需記住集成測試需要設置(在您的案例數據庫中)並花費更長的時間運行。

您也可能爲您的控制器進行了單元測試,這些單元測試可以與其他組件完全隔離,並且不需要數據庫運行,這些是您所討論的單元測試。

如果您不測試實際的數據庫功能,您可以使用僞/模擬對象來替換外部類 - 事實上,使用初始MVC項目創建的測試具有手動僞造對象。

「隔離」你的外部依賴的另一種方法是用你自己的類來扭曲Linq2Sql代碼,並使用Mocking框架來僞造這些類的調用。

2

是的,你真的可以在現實中做到這一點。

能夠隔離每個單元的關鍵是書寫鬆散耦合代碼。依賴於LINQ to SQL(L2S)類不是鬆散耦合的,這就解釋了你的問題。

你最好定義一組可以隱藏你的L2S代碼的接口。然後,域模型在這些接口上工作,而不是直接在L2S類上工作。

+0

你的意思是,我應該更好地測試控制器,或者如果我使用存儲庫模式,測試存儲庫,對吧? – xantrus 2010-03-23 09:29:19

+0

您應該測試(或多或少)所有或您的代碼(每個單元都是孤立的),但Repository模式是鬆散耦合的一個很好的例子。這意味着您可以獨立於具體存儲庫對控制器進行單元測試,而在其他單元測試中,您可以測試具體存儲庫(無需處理控制器)。 – 2010-03-23 09:39:35