2011-08-18 104 views
3

我有一个基本储存库和所有实体储存库继承。假DbContext的实体框架4.1来测试我的储存库

在我的睾丸我创建一个假的DbContext和假DbSet测试我的资料库,但在实现我的FakeDbContext一些方法,当我不能够实现IDbContext.Entry方法:

public class FakeDbContext : IDbContext 
{ 
    private IDbSet<Usuario> _usuario; 
    private IDbSet<Atividade> _atividade; 
    private IDbSet<Autor> _autor; 
    private IDbSet<CategoriaModulo> _categoriaModulo; 
    private IDbSet<CategoriaMateria> _categoriaMateria; 
    private IDbSet<Site> _site; 
    private IDbSet<Modulo> _modulo; 
    private IDbSet<Perfil> _perfil; 
    private IDbSet<CategoriaGaleriaImagem> _categoriaGaleriaImagem; 

    public IDbSet<Usuario> Usuario { get { return _usuario ?? (_usuario = new FakeDbSet<Usuario>()); } set { } } 
    public IDbSet<Atividade> Atividade { get { return _atividade ?? (_atividade = new FakeDbSet<Atividade>()); } set { } } 
    public IDbSet<Autor> Autor { get { return _autor ?? (_autor = new FakeDbSet<Autor>()); } set { } } 
    public IDbSet<CategoriaModulo> CategoriaModulo { get { return _categoriaModulo ?? (_categoriaModulo = new FakeDbSet<CategoriaModulo>()); } set { } } 
    public IDbSet<CategoriaMateria> CategoriaMateria { get { return _categoriaMateria ?? (_categoriaMateria = new FakeDbSet<CategoriaMateria>()); } set { } } 
    public IDbSet<Site> Site { get { return _site ?? (_site = new FakeDbSet<Site>()); } set { } } 
    public IDbSet<Modulo> Modulo { get { return _modulo ?? (_modulo = new FakeDbSet<Modulo>()); } set { } } 
    public IDbSet<Perfil> Perfil { get { return _perfil ?? (_perfil = new FakeDbSet<Perfil>()); } set { } } 
    public IDbSet<CategoriaGaleriaImagem> CategoriaGaleriaImagem { get { return _categoriaGaleriaImagem ?? (_categoriaGaleriaImagem = new FakeDbSet<CategoriaGaleriaImagem>()); } set { } } 

    public void SaveChanges() 
    { 
     //do nothing 
    } 

    public IDbSet<TEntity> Set<TEntity>() where TEntity : class 
    { 
     foreach (PropertyInfo property in typeof(FakeDbContext).GetProperties()) 
     { 
      if (property.PropertyType == typeof(IDbSet<TEntity>)) 
       return property.GetValue(this, null) as IDbSet<TEntity>; 
     } 
     throw new Exception("Type collection not found"); 
    } 

    public System.Data.Entity.Infrastructure.DbEntityEntry Entry<TEntity>(TEntity entity) where TEntity : class 
    { 
    } 
} 

我无法执行的最后一种方法,你们能帮助我吗?

我用这种输入方法在我的基地仓库更新实体:

public abstract class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class 
    { 
     #region Fields 

     protected TEntity EntityType; 
     protected IDbSet<TEntity> DbSet; 

     #endregion 

     #region Properties 

     public IDbContext DbContext 
     { 
      get 
      { 
       return DbContextFactory.Instance.GetOrCreateContext(); 
      } 
     } 

     #endregion 

     #region Constructors 

     protected BaseRepository() 
     { 
      this.EntityType = DependencyResolverFactory.Instance.Get<TEntity>(); 
      this.DbSet = DbContext.Set<TEntity>(); 
     } 

     #endregion 

     #region Methods 

     public virtual void Add(TEntity entity) 
     { 
      this.DbSet.Add(entity); 
     } 

     public virtual void Remove(TEntity entity) 
     { 
      this.DbSet.Remove(entity); 
     } 

     public virtual void RemoveById(object id) 
     { 
      TEntity entity = this.GetById(id); 
      this.DbSet.Remove(entity); 
     } 

     public virtual void Edit(TEntity entity) 
     { 
      this.DbContext.Entry(entity).State = EntityState.Modified; 
     } 

     public virtual TEntity GetById(object id) 
     { 
      return (TEntity)this.DbSet.Find(id); 
     } 

     public virtual IList<TEntity> GetAll() 
     { 
      return ((IEnumerable<TEntity>)this.DbSet).ToList(); 
     } 

     #endregion 
    } 
+0

通过假dbContext测试存储库的含义是什么。 Repository直接执行DbContext。你的仓库类是否有业务逻辑? –

+0

@Ladislav在我的仓库中,我没有将IDbSet或IQueryable暴露给我的控制器,因为那样,我从来没有在测试中使用LINQ To Objects,在我的应用程序中使用LINQ To Entities,将所有LINQ To Objects,以及我的方法存储库将小心使用LINQ To Entities。 –

回答

6

阅读this并在继续之前所有链接的问题。单元测试任何返回与EF相关的类或使用linq-to-entities是很危险的。

放弃单元测试您的存储库,而是通过伪造存储库本身来单元测试您的应用程序逻辑。如果您想测试您的存储库,请创建与真实数据库交谈的集成测试。

+0

但我没有公开IDbSet或Iqueryable到我的控制器。 –

+0

是的,你没有,但你为什么伪造上下文? –