2010-03-18 27 views
2

我對LINQ到SQL適配器類:創建System.Data.Linq.Table試驗

public interface IAdapter : IDisposable 
{ 
    Table<Data.User> Activities { get; } 
} 

Data.User是的LINQ到SQL指向定義的對象用戶表中的持久性。

這種情況的實現方式如下:

public class Adapter : IAdapter 
{ 
    private readonly SecretDataContext _context = new SecretDataContext(); 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 

    public Table<Data.User> Users 
    { 
     get { return _context.Users; } 
    } 
} 

這使得嘲諷持久層容易單元測試,我可以回到我想要的任何數據的收集用戶(Rhino.Mocks):

Expect.Call(_adapter.Users).Return(users); 

問題是我無法創建對象'用戶',因爲構造函數不可訪問,並且類表被封閉。我試過的一個選擇是讓IAdapter返回IEnumerable或IQueryable,但問題是我沒有訪問ITable提供的方法(例如InsertOnSubmit())。有沒有一種方法可以在單元測試場景中創建假表,這樣我可以成爲一個快樂的TDD開發人員?

回答

0

我目前的解決辦法是換表我想要的功能集成到一個TableWrapper類:

public interface ITableWrapper<TEntity> 
    where TEntity : class 
{ 
    IEnumerable<TEntity> Collection { get; } 
    void InsertOnSubmit(TEntity entity); 
} 

而這裏的實現:所以現在

public class TableWrapper<TEntity> : ITableWrapper<TEntity> 
    where TEntity : class 
{ 
    private readonly Table<TEntity> _table; 

    public TableWrapper(Table<TEntity> table) 
    { 
     _table = table; 
    } 

    public IEnumerable<TEntity> Collection 
    { 
     get { return _table; } 
    } 

    public void InsertOnSubmit(TEntity entity) 
    { 
     _table.InsertOnSubmit(entity); 
    } 
} 

我可以從收集輕鬆模擬數據,以及保持InsertOnSubmit的功能(我以後需要的任何其他功能都可以稍後添加)。

0

我已經成功地使用數據訪問層來產生域對象集合,然後使用linq到對象。 被測試的對象只涉及List,這對於單元測試來說相當容易。

我不喜歡什麼時候邏輯實體應該有數據訪問層的依賴關係。他們應該停止在服務層,即使在那裏。我通常會選擇服務層調用數據訪問對象以獲取List的模型,將該列表傳遞給需要它的任何邏輯對象(如果需要,使用linq-to-objects過濾掉相關數據並將其注入到eiter平面列表,字典或對象模型)。

業務對象變得非常易於測試,即使它們沒有從推斷數據模型的豐富性中受益。