c# - NHibernate 单元测试模拟/内存数据库

标签 c# unit-testing nhibernate fluent-nhibernate mocking

我正在尝试学习如何模拟我的通用存储库,以便我可以对我的所有服务进行单元测试。

我正在使用 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 列表而不是数据库或内存数据库。

感谢阅读,期待指教。

最佳答案

我的回答应该/可能是评论,也许吧。因为我想告诉你:不要这样做。不要浪费时间来伪造要从持久性返回的数据。不要将时间花在:从客户端获取数据并将它们放入内存中的某个虚拟数据库中。

您需要确定您的服务(使用存储库)能够真正序列化/呈现真实数据。并反序列化/保留更改。这真的需要一个真实的数据。

宁愿花一些时间来创建脚本,这将填充测试数据。您在测试中期望的数据:业务验证服务数据序列化...

另请看这里:Ayende: NHibernate Unit Testing .摘录:

When using NHibernate we generally want to test only three things, that properties are persisted, that cascade works as expected and that queries return the correct result. In order to do all of those, we generally have to talk to a real database, trying to fake any of those at this level is futile and going to be very complicated.

注意:前段时间,我们曾经将所有测试包装在Transaction Begin()Rollback() 中。这看起来不错。但我们意识到,很多东西 - 因为缺少 Flush() 调用 - 没有完全测试(例如设置 not-null)。

关于c# - NHibernate 单元测试模拟/内存数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20720868/

相关文章:

NHibernate 还是 Fluent NHibernate?

nhibernate - 在 nhibernate 中,当我提交事务时,sql 更新语句不会显示在控制台中。为什么?

c# - 两个列表的 linq 并集

c# - 如何创建一个 'global' 变量来返回 linq 结果?

c# - 在 Microsoft 测试项目中包含资源 dll

javascript - QUnit 不打印任何结果

c# - 使用 List.Contain() 时 Linq to SQL 如何执行?

c# - Entity Framework 实体列表始终为空

unit-testing - 如何编写确保编译失败的 Scala 单元测试?

nhibernate - 流利的NHibernate映射可为空的枚举