2013-07-27 65 views
12

我已經看到了存儲庫模式,非常簡單和直觀的一些實現單元測試,在這裏掛形式其他的答案在計算器Repository模式,並從內存

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C http://www.remondo.net/repository-pattern-example-csharp/

public interface IRepository<T> 
{ 
    void Insert(T entity); 
    void Delete(T entity); 
    IQueryable<T> SearchFor(Expression<Func<T, bool>> predicate); 
    IQueryable<T> GetAll(); 
    T GetById(int id); 
} 

public class Repository<T> : IRepository<T> where T : class, IEntity 
{ 
    protected Table<T> DataTable; 

    public Repository(DataContext dataContext) 
    { 
     DataTable = dataContext.GetTable<T>(); 
    } 
... 

如何設置它在進行單元測試時從內存中運行?有什麼辦法從內存中的任何東西構建一個DataContext或Linq表?我的想法是創建一個集合(List,Dictionary ...)並在單元測試時對其進行存根。

謝謝!

編輯: 我需要的是這樣的:

  • 我有一類書
  • 我有一個類庫
  • Library構造函數中,我初始化存儲庫:

    var bookRepository = new Repository<Book>(dataContext)

  • 而且Library方法使用的存儲庫,這樣

    public Book GetByID(int bookID) 
    { 
        return bookRepository.GetByID(bookID) 
    } 
    

測試時,我想提供一個存儲環境。在生產中,我將提供一個真正的數據庫上下文。

+0

我添加了一些示例代碼下面您的要求。 –

回答

18

我會建議使用嘲笑庫,如MoqRhinoMocks。使用Moq的一個很好的教程可以找到here

在你決定,你會用哪一種,以下內容可能會有所幫助:

信息:單元測試框架的比較可以找到here


UPDATE以下OP的要求

創建內存數據庫

var bookInMemoryDatabase = new List<Book> 
{ 
    new Book() {Id = 1, Name = "Book1"}, 
    new Book() {Id = 2, Name = "Book2"}, 
    new Book() {Id = 3, Name = "Book3"} 
}; 

模擬你的資料庫(我用的起訂量爲下面的例子)

var repository = new Mock<IRepository<Book>>(); 

設置你的資料庫

// When I call GetById method defined in my IRepository contract, the moq will try to find 
// matching element in my memory database and return it. 

repository.Setup(x => x.GetById(It.IsAny<int>())) 
      .Returns((int i) => bookInMemoryDatabase.Single(bo => bo.Id == i)); 

通過傳遞你的模擬對象的構造函數的參數

var library = new Library(repository.Object); 

最後的一些測試創建庫對象:

// First scenario look up for some book that really exists 
var bookThatExists = library.GetByID(3); 
Assert.IsNotNull(bookThatExists); 
Assert.AreEqual(bookThatExists.Id, 3); 
Assert.AreEqual(bookThatExists.Name, "Book3"); 

// Second scenario look for some book that does not exist 
//(I don't have any book in my memory database with Id = 5 

Assert.That(() => library.GetByID(5), 
        Throws.Exception 
         .TypeOf<InvalidOperationException>()); 

// Add more test case depending on your business context 
..... 
+1

非常感謝這篇教程!但是我需要測試一個使用存儲庫的現有類。創建一個'假'存儲庫並以這種方式進行測試只能讓我測試存儲庫模式是否得到了很好的實施。我會試着通過編輯來澄清我的問題 – Kaikus

+0

@Kaikus:如果你可以使用倉庫簡短地實現這個類,那麼這將會很有幫助 –

+0

所以,如果我理解正確,那麼這個想法不是爲了保留'context',而是完全嘲笑倉庫。然後,當實例化一個實體時,我總是必須使用構造函數注入自己的存儲庫(真實存儲庫或模擬存儲庫)。謝謝! – Kaikus