快速信息:我使用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>();
}
非常感謝
編輯:我意識到,單元測試不需要一個數據存儲庫,所以我只是在集成測試中測試這個邏輯。這使得數據庫無用,因爲代碼可以在沒有存儲庫的情況下進行測試。 我想感謝大家的幫助,謝謝:)
查看[本文](http://www.cuttingedge.it/blogs/steven /pivot/entry.php?id=84)。 – Steven
你想要測試什麼? –
好吧,這不僅僅是一次測試,而是我想要設置的,所以我可以運行多個測試,並且不會耗費我的數據庫。在這種情況下,我想測試一個搜索功能,在我的FakeDataRepository中有多個人。當我調用需要測試的方法時,我希望方法使用FakeDataRepository作爲源,因此它可以過濾出正確的人員。 –