2011-08-18 2 views
3

저는베이스 리포지토리를 보유하고 있으며 모든 엔티티 리포지토리가이를 상속받습니다. 내 고환에서가짜 DbContext를 사용하여 Entity Framework 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를 사용하여 저장소를 테스트 할 때의 의미는 무엇입니까? 저장소는 정확한 DbContext입니다. 저장소 클래스에 비즈니스 로직이 있습니까? –

+0

@Ladislav 제 저장소에서 IDbSet 또는 IQueryable을 내 컨트롤러에 노출시키지 않습니다. 왜냐하면 그 테스트에서 LINQ To Objects와 내 App의 LINQ To Entities를 사용하지 않았기 때문에 모든 LINQ To Objects와 리포지토리는 LINQ To Entities를 신중하게 사용합니다. –

답변

6

읽기 this을하고 계속하기 전에 모든 질문에 연결 :

내 기본 저장소에서 엔티티를 업데이트하려면이 입력 방법을 사용하고 있습니다. EF 관련 클래스를 반환하거나 linq-to-entities로 작업하는 유닛을 테스트하는 것은 위험합니다.

리포지토리 단위 테스트를 포기하고 리포지토리 자체를 위조하여 응용 프로그램 논리를 단위 테스트하십시오. 리포지토리를 테스트하려면 실제 데이터베이스와의 통합 테스트를 수행하십시오.

+0

하지만 IDbSet 또는 Iqueryable이 내 컨트롤러에 노출되지 않습니다. –

+0

예, 그렇지만 왜 당신은 컨텍스트를 위조합니까? –

관련 문제