2015-10-15 94 views
6

我有一個工作,我有一個IDisposable DbContext。我想單元測試這個工作,而不打在數據庫中。我必須做什麼選擇?如何使用Unity處理IDisposable存儲庫?

我使用微軟的默認Fakes大會。

我的工作:

public void Work() 
{ 
    do 
    { 
     //code here     
     using (var repository = new Repository<User>()) 
     { 
      repository.Save(user); 
     } 

    } while (true); 
} 

我想測試,並在這部分測試中,因爲它實際上創建存儲庫類的新實例失敗。

我的測試方法:

using (ShimsContext.Create()) 
{ 
    Data.Repository.Fakes.ShimRepository<Domain.Fakes.ShimUser>.Constructor = (a) => { }; 

    Data.Repository.Fakes.ShimRepository<Domain.Fakes.ShimUser>.AllInstances.SaveT0 = (a, b) => 
    { 
    }; 

    var service = GetService(); 
    service.Work(); //Throws exception 
} 

哪有我這個假方法Save

+1

請參閱依賴注入 - 您需要允許傳入參數到Work()或至少進入服務,否則它總是創建一個真實的。 –

+0

我並不熟悉Fakes,但也許它沒有完全滿足您的需求。我知道這對像Moq這樣的圖書館來說是微不足道的(https://github.com/Moq/moq4)。 –

+0

這對於Moq來說也不是微不足道的,因爲他正在工作中實例化存儲庫的實際具體實例。 –

回答

7

你在這裏違反了DIP,使得測試你的服務的單元比它應該更加困難。您還應該避免使用通用存儲庫並支持role interfaces

而是將抽象注入到您的存儲庫服務中,例如, IUsersRepository它定義了你的Save方法。然後在你的服務單元測試中,你可以簡單地使用一個存根實現IUsersRepository

+0

是的,但如何處理對象?如果我注入一次,這個工作將會隨着上下文的第一個實例一起運行。 – gog

+0

處置是抽象的實體框架實現的實現細節。因此,處理是在例如EntityFrameworkUsersRepository。 – devdigital

2

假貨往往會泄露你的代碼不正確遵循在固體d,因爲你是你的類中創建依賴關係,而不是通過他們的。

一個更好的模式將創建一個ISaveRepository接口,反過來用暴露的方法實現IDisposable。然後,您應該將您的存儲庫實例注入到您的類中。這將允許您滿足使用語句測試,並實現一個模擬,該模擬定義了一個不會觸及數據庫的.Save()方法。

public class Test 
{ 
    private readonly ISaveRepository _userRepository; 

    public Test(ISaveRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    public void Work() 
    { 
     using (_userRepository) 
     { 
      var cont = true; 
      do 
      {    
       _userRepository.Save(new User()); 
       cont = false; 
      } while (cont); 
     } 
    } 
} 

public interface ISaveRepository : IDisposable 
{ 
    void Save<T>(T model); 
} 

public class Repository<T> : ISaveRepository 
{ 
    public void Dispose() { } 
    public void Save<TT>(TT model) {} 
} 

public class User {} 
+0

許多實現如何處置不需要? – gog

+0

您的存根實現是否需要配置? XML存儲庫是否需要配置? Web服務調用庫需要處理嗎?等等 – devdigital

+0

@ggui我假設你最初是重新建立連接以避免長時間連接嗎? –

相關問題