fake datarerepository——模拟数据库

本文关键字:数据库 模拟 fake datarerepository | 更新日期: 2023-09-27 18:11:13

快速信息:我使用c# 4.0和RhinoMocks(与AAA)

我将用一些代码来解释我正在考虑做什么:

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; }
    }
}

所以这是一个类,模仿数据库中的数据。现在我想在单元测试中使用这些数据。换句话说,不是从DB中获取数据,而是从数据存储库中获取数据。

我认为我可以通过存根存储库并使其使用数据存储库来实现这一点:

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

这将导致我的代码自动在DataRepository中查找数据。因此,代替存根方法并直接插入一个列表(例如d => d. find (ag . is . anything)). ignorearguments()。返回(您刚刚填写的列表))我将获得"真实"数据返回(从DataRepository过滤的数据)。这意味着我可以测试我的代码是否真的可以找到一些东西,而不必在我的数据库(集成测试)中插入测试数据。

我该如何去实现这样的事情呢?我试着在网上找文章或问题,但我似乎找不到很多:/

任何帮助都是感激的。

编辑:我试过SimpleInjector和StructureMap,但我卡住了实现其中一个。

我目前在我的实体框架上使用一个存储库,所以我的baseBL看起来像这样(注意:我所有的其他BL继承自这个):

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

My Repository类:

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。我不明白如何用数据类替换实体框架,因为那个数据类不适合这里。

我应该让我的数据存储库继承我的IRepository类并使我自己的实现吗?

public class SampleData : IRepository

但是我不能这样处理我的列表:/

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

再次感谢你的帮助

EDIT:我意识到单元测试不需要数据存储库,所以我只是在集成测试中测试该逻辑。这使得数据存储库毫无用处,因为代码可以在没有存储库的情况下进行测试。不过我还是要感谢大家的帮助,谢谢:)

fake datarerepository——模拟数据库

使用依赖注入框架来处理你的依赖。在单元测试中,您可以将实际实现与存根实现交换。

例如,在StructureMap中,您将在代码中写入。"好,现在给我IDataRepository的活动实例",对于你的正常代码,这将指向一个对真实数据库的实现。在单元测试中,你可以用ObjectFactory.Inject(new FakeDataRepository())来覆盖它。然后所有代码都使用假的repo,这使得测试单个单元work.Í
变得非常容易。