伪DataRepository - 模拟数据库

时间:2011-10-13 11:48:52

标签: c# testing mocking repository rhino-mocks

快速信息:我正在使用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; }
    }
}

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

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

UC1003_ConsultantsBeherenBL consultantsBeherenBL = new UC1003_ConsultantsBeherenBL();

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

这会导致我的代码自动在DataRepository中查找数据。因此,而不是存根方法并直接插入一个列表(例如d =&gt; d.Find(Arg.Is.Anything))。IgnoreArguments()。返回(你刚刚填写的列表))我会得到“真实的“数据返回(已从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>();
    }

再次感谢您的帮助

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

1 个答案:

答案 0 :(得分:4)

使用Dependency injection framework来处理您的依赖项。在您的单元测试中,您可以将实际实现与存根实现交换。

例如,在StructureMap中,您将在代码中说明。 “好了,现在给我IDataRepository的活动实例”,对于普通代码,这将指向实际数据库的实现。在您的单元测试中,您可以通过放置ObjectFactory.Inject(new FakeDataRepository())来覆盖它。然后,所有代码都会使用虚假仓库,这样就可以轻松测试单个工作单元.Í