【问题标题】:Create a fake DbContext创建一个假的 DbContext
【发布时间】:2012-09-07 14:39:01
【问题描述】:

我正在使用 EF 创建一个 MVC 应用程序,目前使用的是通用存储库模式,例如:Generic Repository Pattern。除了为每个存储库创建一个新的上下文并且在我的应用程序中需要使用两个或更多存储库这一事实之外,一切都运行良好。当我使用 StructureMap 时,我添加了

x.For<IDbContext>().HttpContextScoped().Use(context => new MyContext());

其中 IDbContext 有各自的方法,不再是泛型,而是通过构造函数传递。

当我必须进行测试时,问题就出现了——我想创建一个内存存储(比 db、自定义、易于控制的数据更快),例如 HashTable 或 HashSet。我想不通的是如何制作一个假的 IDbContext 实现,从该 HashTable 中检索数据。供参考 IDbContext 看起来像这样(仅通用存储库中 DbContext 使用的方法):

    public interface IDbContext : IDisposable
    {
        IDbSet<TEntity> Set<TEntity>() where TEntity : class;
        DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
        int SaveChanges();
    }

在目前的情况下,我想我犯了一个重大错误,因为创建虚假上下文似乎不是常规程序。任何有关如何改进我的应用程序架构并使其更具可测试性的建议都值得赞赏。

【问题讨论】:

    标签: asp.net-mvc entity-framework unit-testing


    【解决方案1】:

    当我过去这样做时,我通常使用字典来保存我的测试数据,例如:

    public class FakeDb : IDbContext
    {
        private Dictionary<Type, Object> _lists = new Dictionary<Type, Object>();
        public List<T> GetList<T>()
        {
            var type = typeof(T);
            if(!_lists.Contains(type))
            {
                _lists.Add(type, new List<T>());
            }
            return (List<T>)_lists[type];
        }
    
        ///
    }
    

    从更广泛的角度来看,通过将我的查询构建逻辑包装到 individual classes rather than repository classes 中,我取得了很大的成功。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 2022-01-23
      • 2014-12-04
      • 2014-05-17
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多