2010-12-13 41 views
2

我發現很難測試EntityFramework 4。我使用它使用數據庫的第一種方法,現在太晚,以移動到poco.Needed交付相當快,沒時間照常學習。EF4存儲庫模式問題注入存儲庫到服務。似乎沒有得到它的權利

我已經實現了存儲庫模式與工作單元,但我發現很難注入一個存儲庫到我的服務層,以便我可以測試我的業務層服務,驗證等行爲...沒有擊中數據庫。 但我在許多小問題上招致。

  1. 爲了將Repository注入服務(構造函數),調用層需要引用DAL(EF實體)。我不想這

  2. 如果我有很多存儲庫EG CustomerRepository,EmployeeRepository比我需要有多少構造函數作爲存儲庫,以便我可以注入存儲庫。

    3.不確定該從哪裏出發。我沒有在網上找到任何使用EF4將資源庫注入服務的例子。我見過的所有例子都是嘲笑自己的存儲庫,這對我並不好。

我需要測試我的服務層/ BizLayer沒有擊中數據庫。

所有的事情都是不可測試的,並增加了這麼多的依賴和問題。

諾迪比如我已經把

public class DepartmentServiceLibrary 
{ 
    private readonly IDepartmentRepository _departmentRepository; 

    public DepartmentServiceLibrary(IDepartmentRepository departmentRepository) 
    { 
     _departmentRepository = departmentRepository; 
    } 

    public List<DepartmentDto> GetDepartments() 
    { 
     return DeparmentBiz.GetDepartments(); 
    } 

    private DeparmentBL _departmentBiz; 
    private DeparmentBL DeparmentBiz 
    { 
     get 
     { 
      return _departmentBiz ?? new DeparmentBL(_departmentRepository); 
     } 
    } 
} 

//內部類

internal class DeparmentBL 
{ 
    private readonly IDepartmentRepository _departmentRepository; 

    public DeparmentBL(IDepartmentRepository departmentRepository) 
    { 
     _departmentRepository = departmentRepository; 
    } 

    public List<DepartmentDto> GetDepartments() 
    { 
     using (var ctx = new AdventureWorksContext()) 
     { 
      var uow = new UnitOfWork(ctx); 
      _departmentRepository.UnitOfWork = uow; 
      var query = _departmentRepository.GetAll(); 

      return query.Select(dpt => new DepartmentDto 
              { 
               DepartmentId = dpt.DepartmentID, 
               Name = dpt.Name, 
               GroupName = dpt.GroupName 
              }).ToList(); 
     } 
    } 
} 

以下TestMethod的要求我一個引用添加到其擊敗點的dal

[TestMethod] 
    public void Should_be_able_to_call_get_departments() 
    { 
     var mock = new Mock<IDepartmentRepository>(); 
     var expectedResult = new List<Department>(); //Dependency to DAL as Department is a EF Entity generated by EF. 

     mock.Setup(x => x.GetAll()).Returns(expectedResult); 
     var companyService = new MyCompanyBL(mock.Object); //InternalVisibileTO 
     var departments = companyService.GetAll(); 
     //assert removed for brevity 

任何建議或例子顯示如何做到這一點? 感謝

} 

回答

1

簡短的答案是 - 因爲你不使用POCO的,所有的層將有你的DAL的參考。

如果沒有POCO,則使用代碼生成,這意味着EF會在Model.edmx.designer.cs文件中創建模型類。

一個選項(還沒有嘗試過 - 關閉我的頭頂)。

是手動將EF實體投影到DTO的。

所以你的倉庫可以做到這一點:

public List<OrderDTO> GetOrdersForCustomer(int customerId) 
{ 
    return _ctx.Orders 
     .Where(x => x.CustomerId == customerId) 
     .ToList() 
     .Select(x => new OrderDTO { // left to right copy }); 
} 

的OrderDTO類可以是一個單獨的組件,該組件庫的引用,以及您的其他項目。因此,其他項目將在DTO程序集中運行,並且不需要引用存儲庫。

但是,在這裏你可以投射到任何地方(基本上是做POCO,但是手動,並有更多的工作)左右複製屬性 - 非常痛苦。

但是,這是一個選項。

老實說 - 它不需要很長的時間轉移到POCO的。

有一個T4模板可以爲您生成POCO - 您可以在幾分鐘內啓動並運行。

而且由於您已經在使用依賴注入和存儲庫,您應該咬住項目符號並更改爲POCO,或保留對DAL的引用。在代碼方面類似

+0

發現只是證實了我的fears.Do我需要學習t4.Everything我做我必須能夠解釋。我會給它一個 – user9969 2010-12-13 10:44:12

+0

隨着poco我想你轉向代碼生成和使用t4 templates.How有關存儲過程,複雜類型等。如何處理它們在poco.Do你產生它們? – user9969 2010-12-13 10:56:04

+0

@ user231465 - 這裏是T4 POCO Generator:http://visualstudiogallery.msdn.microsoft.com/en-us/23df0450-5677-4926-96cc-173d02752313。你不需要「學習」T4本身。只需安裝它,讓它生成您的POCO - 並將生成的POCO移到單獨的程序集。 – RPM1984 2010-12-13 11:08:04