2012-03-31 43 views
0

我正在使用Linq2SQL進行數據訪問的項目。該項目由一個ASP.NET MVC應用程序和8個類庫組成。大多數類庫都有自己的L2S數據類。作爲我正在做的工作的一部分,我試圖讓測試中的各種組件介紹一些穩定性清理代碼庫,它目前大量使用靜態類和方法,並且控制器具有靜態DataContexts始終使用。如何抽象Linq2SQL的可測試性

我該如何重構L2S的使用情況,以便測試控制器的操作?

我已經在應用程序中引入了依賴注入來分離一些其他服務,但我不希望DataContext作爲控制器的依賴項屬性,因爲我想控制DataContexts及其DataLoadOptions的實例化。

我曾嘗試過的一件事是利用L2S生成的部分類,並向DataContext添加了一個接口,但是我發現抽象層冒進了應用程序,而不是停留在類庫中。它並不覺得自己是正確的做事方式,而且維持這種做法會很痛苦。這個方法有沒有人有過特殊的成功或失敗?

回答

3

我使用Repository模式來隱藏DataContext裏面。存儲庫是抽象的,所以套件非常適合依賴注入的原理。

例如,您可以定義一些存儲庫。

public interface IUserRepository 
{ 
    User Get(int id); 
    User Save(User user); 
    void Delete(User user); 
} 

實現是一樣的東西

public class UserRepository : IUserRepository 
{ 
    private MyDataContext _context; 

    UserRepository() 
    { 
     _context = new MyDataContext(); 
    } 

    // ... 

} 

現在,控制器只取決於接口。

public UserController : Controller 
{ 
    UserController(IUserRepository userRepository) { } 
} 

因此,它是完全可測試的,因爲你可以模擬在測試中IUserRepository

+0

這將從LINQ到SQL的抽象,但它也將刪除它的所有功能。有了這個方案,我們又回到了輸入數據集。 – usr 2012-03-31 13:45:05

+0

@usr - 我不這麼認爲.. – 2012-03-31 15:47:02

+0

我沒有看到執行查詢的方法。大多數有趣的應用程序都需要查詢,而不僅僅是過濾和orderby。你需要一個通用的查詢工具。 – usr 2012-03-31 15:48:38

1

雖然this article是指使用實體框架的可測試性,但高層概念可以在這裏應用。

這些示例的核心概述了使用「工作單元」模式和「存儲庫」模式。工作單元是圍繞數據上下文的抽象,代表特定控制器或一組類似控制器的工作集。您可以在單元中包含多個存儲庫,並且由於存儲庫基於IEnumerableIQueryable,因此您仍然可以利用LINQ功能。

可測試性選項包括嘲笑單元和存儲庫,或創建用於測試目的的內存表示。