2011-10-13 95 views
1

快速信息:我使用C#4.0和RhinoMocks(AAA級)假DataRepository - 模擬數據庫

我會用一些代碼什麼,我想這樣做解釋:

public class SampleData 
{ 
    private List<Person> _persons = new List<Person>() 
    { 
     new Person { PersonID = 1, Name = "Jack"}, 
     new Person { PersonID = 2, Name = "John"} 
    }; 

    public List<Person> Persons 
    { 
     get { return _persons; } 
    } 
} 

所以這是一個類模仿數據庫中的數據。現在我想在我的單元測試中使用這些數據。換句話說,我不想從數據庫中獲取數據,而是想將它們從數據源中取出。

我想我可以通過測試框架的存儲庫,並通過使用DataRepository,而不是實現這一目標:

UC1003_ConsultantsBeherenBL consultantsBeherenBL = new UC1003_ConsultantsBeherenBL(); 

consultantsBeherenBL = MockRepository.GeneratePartialMock<UC1003_ConsultantsBeherenBL>(); 
consultantsBeherenBL.Repository = MockRepository.GenerateMock<IRepository>(); 

這將導致我的代碼,以全自動尋找在DataRepository,而不是數據。所以不是直接插入一個方法,而是直接插入一個列表(例如d => d.Find(Arg.Is.Anything))。IgnoreArguments()。Return(你剛填好的列表))我會得到「真正的」數據返回(從DataRepository中過濾的數據)。這意味着我可以測試我的代碼是否可以真正找到某些東西,而無需在我的數據庫中插入測試數據(集成測試)。

我該如何去實現這樣的事情?我試過在網上查找文章或問題,但我似乎找不到很多:/

任何幫助表示讚賞。

編輯:我試過SimpleInjector和StructureMap,但我堅持實現其中之一。目前我使用我的實體框架的存儲庫

,所以我baseBL看起來像這樣(注:我的所有其他BL的enherit從這個):

public class BaseBL 
{ 
    private IRepository _repository; 

    public IRepository Repository 
    { 
     get 
     { 
      if (_repository == null) 
       _repository = new Repository(new DetacheringenEntities()); 
      return _repository; 
     } 
     set { _repository = value; } 
    } 

    public IEnumerable<T> GetAll<T>() 
    { 
    ... --> Generic methods 

我的倉庫類:

public class Repository : BaseRepository, IRepository 
{ 
    #region Base Implementation 

    private bool _disposed; 

    public Repository(DetacheringenEntities context) 
    { 
     this._context = context; 
     this._contextReused = true; 
    } 

    #endregion 

    #region IRepository Members 

    public int Add<T>(T entity) 
    ... --> implementations of generic methods 

據我所知,我現在需要能夠在我的測試中說,而不是使用DetacheringenEntities,我需要使用我的DataRepository。我不明白我是如何用數據類切換出我的實體框架的,因爲那個數據類不適合那裏。

我應該讓我的DataRepository使我的IRepository類成爲我自己的實現嗎?

public class SampleData : IRepository 

但我不能做這樣的事情與我的列表:再次求助/

public IEnumerable<T> GetAll<T>() 
    { 
     return Repository.GetAll<T>(); 
    } 

非常感謝

編輯:我意識到,單元測試不需要一個數據存儲庫,所以我只是在集成測試中測試這個邏輯。這使得數據庫無用,因爲代碼可以在沒有存儲庫的情況下進行測試。 我想感謝大家的幫助,謝謝:)

+0

查看[本文](http://www.cuttingedge.it/blogs/steven /pivot/entry.php?id=84)。 – Steven

+0

你想要測試什麼? –

+0

好吧,這不僅僅是一次測試,而是我想要設置的,所以我可以運行多個測試,並且不會耗費我的數據庫。在這種情況下,我想測試一個搜索功能,在我的FakeDataRepository中有多個人。當我調用需要測試的方法時,我希望方法使用FakeDataRepository作爲源,因此它可以過濾出正確的人員。 –

回答

4

使用Dependency injection framework來處理您的依賴關係。在你的單元測試中,你可以將真正的實現與一個殘缺的實現交換。

在StructureMap中,例如,你會在你的代碼中說。「好吧,現在給我一個IDataRepository的活動實例」,對於您的普通代碼,這將指向實際數據庫的實現。在你的單元測試中,你可以通過把ObjectFactory.Inject(new FakeDataRepository())覆蓋。假回購隨後被所有代碼使用,這使得測試單個工作單元變得非常簡單.i

+0

嘿,謝謝你的回答。我將嘗試實施它(4.0版)。我會告訴你,如果它的工作,因爲它肯定聽起來像我需要的東西:) –

+0

我在我的問題中添加了新的部分,因爲我有一些問題實現它。 –