如何在單元測試時隔離ORM

在項目中須要對DAL層進行單元測試,若是直接操做數據庫,首先測試速度會大大降低,並且讓單元測試直接使用外部依賴,極可能帶來後續維護的不便,因此有必要對數據庫隔離,而後單獨測試DAL層。因爲使用了ORM框架EF,就從EF入手。按照單元測試的思路,這是便在DAL層與EF之間找到或製造接縫,並從接縫處開始分割、注入。html

 

一 基本思路數據庫

a) 有個專門的設計模式(Repository)能夠解決這個問題,這種模式除了能很好的達成我目前隔離ORM以進行單元測試的目的,還容許方便地替換ORM和數據庫,好比從EF換成Dapper、從SQL Server 換成MySQL。這看來是很好的方法,但有點複雜,沒有弄明白。這兒是爲了達到隔離ORM框架的目的,因此就借鑑Repository模式的思路,先來個簡化版的,借用別人的圖描述:設計模式

 

圖片來源:http://www.cnblogs.com/zhaopei/p/UnitTesting.html緩存

 

之前在DAL中直接操做EF,二者緊密耦合。拿操做Student實體來舉例,重構後將EF相關的代碼都封裝到IStudentRepository接口後面,這樣DAL中操做的是IStudentRepository接口的方法而再也不是EF了,隨後即可以用實現IStudentRepository接口的樁對象來替換EF了。app

 

b) 具體的實現中,規定了IRepository<T>接口,這個接口定義了基本的增刪改查操做框架

 

 

 

若是是與後臺管理員相關的邏輯,AdminUserRepository會實現這個接口,Add方法以下,在這裏會直接操做EF對象(FitDbContext)。函數

 

 

而後在AdminUserService中,將AdminUserRepository通過構造函數傳入單元測試

 

 

AdminUserRepository是對EF操做的封裝,由於它實現了IRepository接口,因此能夠基於IRepository接口產生僞對象,並且這樣的結構還容許在AdminUserRepository中實現緩存,這樣來看,叫Repository真是太形象了,上層代碼能夠直接從倉庫中拿數據,而沒必要關心數據是直接從數據庫拿仍是上次緩存的。通過這樣的改造後,即可以方便地進行單元測試了。測試

 

 

 

 

二 隔離後的測試案例設計

下面是一些使用NUnit和NSubstitute的測試代碼記錄

a) 驗證樁對象的int型返回值

 

 

b) 測試返回的IQueryable結果集

 

爲了僞造IQueryable結果集花了很多功夫,最後終於知道能夠用.AsQueryable()方法。

 

c) 若是要驗證返回的實體是否相等,須要重寫相關的Equals方法

 

在AreEqual能夠指定「相等」的標準

相關文章
相關標籤/搜索