2017-02-14 218 views
1

我一直在四處尋找一個解決方案,但我無法找到答案(如herehere實體框架6和單元測試

public class ItemsRepository { 
    public ItemDto Get(int id) { 
     using (var db = new ItemContext()) { 
      return db.Items.FirstOrDefault(i => i.Id == id) 
       .ToDto(); 
     } 
    } 
} 

我使用的將所有的方式來測試該代碼到DB。我知道這不是一個好習慣,因爲這種情況下的單元測試也會測試與數據庫的連接。

理想情況下,我想構建一個內存數據庫並對其進行種子處理。在這種情況下我會怎麼做?如何僞造ItemContext來使用內存列表?

請注意,我不想將Context作爲構造函數公開,因爲用戶必須知道數據的存儲方式。

回答

1

您不能假冒ItemContext,因爲new關鍵字始終會創建對象的新實例。理想情況下,您應該通過依賴注入來注入上下文。是這樣的:

public class ItemsRepository { 
    public ItemDto Get(int id) { 
     return _itemContextService.Items.FirstOrDefault(i => i.Id == id) 
       .ToDto();    
    } 
} 

在單元測試_itemContextService應注射和_itemContextService.Items應用模擬數據進行配置。所有的邏輯,你應該單元測試是:

FirstOrDefault(i => i.Id == id).ToDto();    

這只是什麼Get(int id)方法做。與單元測試此方法的數據庫連接超出範圍。

無論如何,如果你不能使用一些DI容器或以某種方式注入ItemContext那麼你可以在單元測試項目中模擬你的連接字符串。