2010-05-05 83 views
13

用LINQ to SQL DAL編寫單元測試的好方法是什麼?使用數據訪問層進行單元測試

目前我正在做一些數據庫測試,需要創建訪問數據庫的幫助程序方法,但我不想在我的主要數據庫中使用這些方法。

所以我得到的是DAL的兩個副本,一個在我的主項目中,另一個在Test項目中。如果我爲數據層創建單獨的項目,管理這些事情會更容易嗎?我不確定哪種方法是更好的方法來解決這個問題。

如果我確實創建了一個數據層項目,我是否可以將所有的回購項目移動到該項目中?我不知道如何正確設置圖層。

感謝

+0

我看過「如果我創建數據層項目,我是否也會將所有回購項目移動到該項目中?」像你這樣的問題已經在使用下面答案中提出的存儲庫模式,但顯然你在某些測試中還必須做某種數據庫訪問? 通常這意味着你真的在測試Linq到SQL,我期望微軟工程師已經完成了這項工作。我建議您避免使用這些方法,並使用一個memorycontext後端測試您的存儲庫,如Jason Jones鏈接到的文章中所述。 – AHM 2010-05-05 20:55:59

回答

5

我使用LINQ2SQL我DAL層和我把它作爲一個單獨的項目。在我的域項目中,我有一個存儲庫接口,然後在我的DAL項目中使用自定義Linq2SqlCarRepository實現,此類包裝生成的Linq2Sql類。

例如。 在Car.Core項目

public interface ICarRepository 
{ 
    IQueryable<Car> GetAllCars(); 
    void Add(Car); 
} 

然後我有它封裝了訪問所產生的LINQ2SQL類接口的實現。

Car.Data項目

public class SqlCarRepository : ICarRepository 
{ 
    private CarDataContext _context; 

    public SqlCarRepository() 
    { 
     _context = new CarDataContext(); 
    } 

    #region ICarRepository Members 

    public IQueryable<Car> GetAllCars() 
    { 
     return _context.Cars; 
    } 

然後我有一個測試項目Car.Data.Test然後用嘲笑嘲笑ICarRepository和測試了。我認爲這與你所描述的略有不同。但是我認爲你想嘗試從你的應用程序中分離出DAL,所以如果你願意,它可以被替換掉。

我還沒有得到所有的完全排序的,但我現在有這些項目:

Car.Core   --- All the interfaces and domain objects, DTO's etc 
Car.Core.Tests --- The tests of the core business logic. 
Car.Web   --- Asp.net MVC frontend 
Car.Web.Tests --- Tests for the website 
Car.Data   --- The Linq2Sql stuff lives in here 
Car.Data.Tests --- The tests for the DAL layer 

這就是我目前得到儘管它可能不是現在做事情的最好方法。

我建議通過The Onion Architecture閱讀並觀看MVC StoreFront視頻獲取靈感;祝你好運。

6

我將使用Visual Studio雜誌2009年9月發表的文章中標題爲「消除測試驅動開發中的數據庫依賴關係」中的存儲庫模式。自從我閱讀了這篇文章並取得了巨大成功後,我一直在使用這種模式這種模式將有助於解耦您的數據層並編寫出好的單元測試。

這將要求您採用n層架構並創建單獨的數據層,但從長遠來看,這是值得的。

這裏是鏈接到在線文章。 Repository Pattern