J'utilise NHibernate et j'ai beaucoup de dépôts, qui héritent tous d'une classe de base NHibernateRepository. Voici un de mes dépôts:Comment se moquer d'une classe de base en utilisant une structure de carte?
public class StaffRepository : NHibernateRepository<IStaff>,
{
public IEnumerable<IStaff> GetBySiteRegionAndMonth(int siteId, int regionId, DateTime firstOfMonth)
{
return Repository.Where(ab => ab.SiteId == siteId && ab.WorkDate >= firstOfMonth && ab.WorkDate < firstOfMonth.AddMonths(1));
}
}
Et la classe de base:
public class NHibernateRepository<TEntity> : IRepository<TEntity> where TEntity : IEntity
{
protected ISession session;
public NHibernateRepository()
{
this.session = new SessionCache().GetSession();
}
public IQueryable<TEntity> Query
{
get
{
return session.Query<TEntity>();
}
}
// Add
public void Add(TEntity entity)
{
session.Save(entity);
}
// GetById
public TEntity GetById(int id)
{
// return session.Load<TEntity>(id);
return this.Query.SingleOrDefault(e => e.Id == id);
}
}
J'essaie maintenant de se moquer de la classe de base NHibernateRepository
utilisant une classe de test qui ne sera pas accéder à une base de données réelle, mais utilisera plutôt une liste statique. Voici mon inscription de la classe de test dans ma structure conteneur carte:
x.For(typeof(IRepository<>)).Use(typeof(TestNHibernateRepository<>));
Mon problème est que le vrai NHibernateRepository
est encore utilisé dans les tests. J'utilise le StaffRepository
réel selon mon inscription:
x.For<IStaffRepository>().Singleton().Use<StaffRepository>();
Toutes mes autres classes d'essai sont injectés très bien, mais je pense que cela est problématique, car il est une classe héritée. Comment puis-je m'assurer que mon StaffRepository utilise le TestNHibernateRepository
au lieu de NHibernateRepository
?