0

這是在3天的研究和編寫代碼之後。我有EF Code First(EF5)和一個建立在它之上的通用存儲庫模式。我們有ICustomerRepository<Customer> : IRepository and CustomerRepository : RepositoryBase<MyContext> , ICustomerRepository。所以當我去測試這個時,我發現我必須寫一個FakeDbContext,一個假IDbSet,然後僞造這些數據,並且做更多的事情。所有這一切,當我知道我將使用我的內存數據測試Linq到Objects時,Linq to Entities將需要以集成測試的形式進行另一套測試。所以,無論是我的代碼結構是錯誤的,因此編寫單元測試非常困難,或者有更好的方法來編寫我不知道的測試,或者我應該只進行集成測試。我正在使用NUnit和MOQ。有沒有正確的方法來測試EF代碼優先庫模式?

編輯:我試圖測試什麼? 我想檢查GetCustomersByType,Add,GetOrderPlacedByCustomer等方法。試圖查看這些方法內部的邏輯是否正確。這是什麼單元測試的,我猜。

+1

*你想要測試什麼?測試有什麼目的? –

+0

然後,是的 - 對於那種單元測試,您需要創建假數據結構。你可以通過創建你自己的實現或者通過嘲笑來做到這一點。我建議在你正在測試的東西的最外邊界利用嘲弄。 –

+0

如果我嘲笑我的背景他們我的單元測試將參考EF,這是一個好主意嗎?我不確定,只是試圖讓我的頭在這附近。 –

回答

2

我想你會得到更多的東西,如果你創建一個測試初始化​​方法,將在每次測試之前設置所有的數據,即黑盒測試。最後,你會知道存儲庫層正在真正的數據庫上正常工作,而不是被嘲弄。

例如:

public static void Init() 
    { 
     _unityContainer = new UnityContainer(); 
     _unityContainer.LoadConfiguration(); 
     _persistenceFactory = _unityContainer.Resolve<IPersistenceFactory>(); 
     _unitOfWork = _persistenceFactory.GetUnitOfWork(); 
     _usersRepository = _persistenceFactory.GetUsersRepository(); 
     _usersRepository.RemoveAll(); 
     _unitOfWork.Commit(); 
    } 

    public static void InsertTestData() 
    { 
     User u = new User("[email protected]", "John Doe", "johndoe"); 

     _usersRepository.Add(u); 
     _unitOfWork.Commit(); 
    } 
+0

,那麼這樣的測試將需要很長時間才能運行,因此不符合單元測試的要求。 –

1

您可以使用TransactionScope模擬DB訪問,但沒有提交到數據庫中的實際變化。事情是這樣的:

[TestMethod] 
public void AddingShouldWork() 
{ 
    using (var transaction = new TransactionScope()) 
    { 
     var repository = new ICustomerRepository<Customer>(); 
     var customer = new Customer(); 
     customer.Name = "OEM Computers Inc."; 
     repository.Add(customer); 
    } 
} 

通過不調用transaction.Complete()的操作一樣處理回滾,導致沒有數據庫插入。這只是您想要進行單元(而非集成)測試的行爲。您也可以使用Moq<Customer>不創建實體。

+0

是一個好主意,適用於我擔心我的分貝。我現在不想對數據庫進行測試。一旦我知道我的代碼中的邏輯是正確的,我會這樣做。 –

+0

你也可以從現在開始使用它。 ;)您可以在實際的DbSet和DbContext上編寫測試,而不會以任何方式在內部影響它們(或內部的數據)。您可以(例如)編寫一個生成測試數據的方法,並將其添加到DbContext並從事務範圍內調用此方法。 – Carsten

+0

雖然沒有答案我正在尋找你的文章,在我的集成測試中非常有用。我肯定會使用的東西。 –

相關問題