2

我正在使用 EF 创建一个 MVC 应用程序,目前使用的是通用存储库模式,例如:通用存储库模式。除了为每个存储库创建一个新的上下文并且在我的应用程序中需要使用两个或更多存储库这一事实之外,一切都运行良好。当我使用 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();
    }

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

4

1 回答 1

0

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

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

    ///
}

从更广泛的角度来看,通过将查询构建逻辑包装到单个类而不是存储库类中,我取得了很大的成功。

于 2012-09-14T12:59:55.410 回答