在使用 NHibernate 进行持久性的项目中测试数据模型

Posted

技术标签:

【中文标题】在使用 NHibernate 进行持久性的项目中测试数据模型【英文标题】:Testing Data Model in project that uses NHibernate for persistence 【发布时间】:2009-11-20 20:56:21 【问题描述】:

我还是 NHibernate 的新手,如果我在这方面有任何错误,请纠正我。

当您使用 NHibernate 从数据库记录构建对象集合时,NH 负责实例化您的集合并填充它们。

在编写实际上不使用 NH 的测试时,如何实例化 ISet 集合?

【问题讨论】:

【参考方案1】:

您可以通过使用构造函数或直接在声明中实例化字段来实例化字段。使用 NHibernate 映射的类可以忽略持久性。

public class MyEntity

   private readonly ISet<ChildEntity> children;

   public MyEntity()
   
      children = new HashedSet<ChildEntity>();
   

   public IEnumerable<ChildEntity> Children
   
      get  return children; 
   

   public void AddChild(Child child)
   
     children.Add(child);
   

【讨论】:

您也可以在字段中初始化您的集合: private readonly ISet children = new HasedSet();这样你就不必编写构造函数了。 为什么您的属性和字段类型不同? @Ronnie Overby:你什么意思?映射? @Marek Tihkan:这是真的(见编辑) 不,在类中,您的 children 字段属于 ISet 类型,但公开它的属性属于 IEnumerable 类型。为什么不让它们一样呢? 因为我想让我的聚合根(用 ddd 术语, MyEntity )负责它的孩子。我想将集合作为只读方式公开给我的聚合根之外的世界。谷歌聚合根以阅读有关此概念的更多信息。当您喜欢它时,您可以将 ISet 暴露给外部世界。只需在上面的代码中将 IEnumerable 更改为 ISet 即可。 ddd 聚合根概念与 NHibernate 无关,它只是将您的域建模到您的代码。您可以说“将孩子添加到父母”,也可以说“将孩子添加到父母的孩子”【参考方案2】:

假设您要测试的不是数据层本身(例如您的域逻辑),您可以简单地自己创建对象并用测试用例数据填充它们。或者你可能真的很偷偷摸摸地创建一个包含所有测试用例的数据库。

【讨论】:

以上是关于在使用 NHibernate 进行持久性的项目中测试数据模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Fluent 设置 NHibernate.Burrow?

使用 NHibernate 进行级联更新一对多

系列抽象类和NHibernate

DDD with L2S or NHibernate... 关于业务对象的持久化数据

NHibernate 保存非持久化实体,同时保持现有 ID

NHibernate中持久性模型的确切含义是啥?