gpt4 book ai didi

c# - Entity Framework 4.1 的假 DbContext 来测试我的存储库

转载 作者:行者123 更新时间:2023-11-30 14:38:55 28 4
gpt4 key购买 nike

我有一个基本存储库,所有实体存储库都继承自它。

在我的睾丸中,我创建了一个 Fake DbContext 和 Fake 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
{
}
}

最后一个方法我无法实现,你们能帮帮我吗?

我正在使用这个 Entry 方法来更新我的基础存储库中的实体:

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
}

最佳答案

阅读this以及所有相关问题,然后再继续。对任何返回 EF 相关类或使用 linq-to-entities 进行单元测试是危险的。

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

关于c# - Entity Framework 4.1 的假 DbContext 来测试我的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7106977/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com