我正在尝试学习如何模拟我的通用存储库,以便我可以对我的所有服务进行单元测试.
我使用NHibernate Fluent来处理数据访问和Ninject的依赖(我对测试它不感兴趣)
我的存储库界面如下所示:
public interface IRepository<TEntity> where TEntity : class { IQueryable<TEntity> GetAll(); TEntity Get(int key); void Insert(TEntity entity); void Update(TEntity entity); void Delete(int id); }
实际的存储库看起来像:
public class GenerRepository<TEntity> : IRepository<TEntity>where TEntity : Entity { protected ISession Session{get { return NHibernateHelper.OpenSession(); }} public IQueryable<TEntity> GetAll(){return Session.Query<TEntity>();} public TEntity Get(int key){return Session.Get<TEntity>(key);} public void Insert(TEntity entity){Session.Save(entity);} public void Update(TEntity entity){Session.Update(entity);} public void Delete(int id){Session.Delete(Session.Load<TEntity>(id));} }
我的所有服务都执行以下操作,将创建的存储库放入其中并使用它.
我已经阅读了很多关于如何做到这一点的文章,但没有一篇很简单或很好解释.所以在创建测试通用存储库或甚至模拟它之间的任何建议.我也有兴趣创建一个内存数据库但是如何在我的测试项目中为流畅的nhibernate设置配置而不在我的实际项目中编辑代码?
是否可以使通用存储库命中一个Tentity列表而不是数据库或内存数据库.
感谢阅读并期待建议.
解决方法
有几种方法可以实现这一目标,
>使用真实数据库进行测试,使用脚本来设置和恢复数据库,但是使用这种方法,当数据库发生更改时,创建和维护这些脚本需要花费时间和精力.>使用真实数据库,并使用事务范围进行测试(启动事务持久化,并进行测试,一旦完成所有操作仅回滚事务),这是一个非常好的方法,我将其用于大型项目.然而,一个问题是运行测试需要花费大量时间(我有大约3500次测试,总共运行40分钟)>使用虚假存储库(具有实体的内部列表)进行业务逻辑测试,并使用实际存储库来验证映射.这种方法需要额外的努力来创建和维护虚假存储库.可以在假存储库上执行在实际存储库上执行的相同测试,以验证假货是否正常工作.使用这种方法,测试执行会更快.