【问题标题】:Testing the persistence layer in a DDD/TDD application在 DDD/TDD 应用程序中测试持久层
【发布时间】:2009-03-31 22:39:09
【问题描述】:

如果我有以下域对象:

public class Customer
{
    public virtual Guid Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<Order> Orders { get; set; }

    public Customer()
    {
        Orders = new HashedSet<Order>();
    }

    public virtual void AddOrder(Order order)
    {
        order.Customer = this;
        Orders.Add(order);
    }
}

使用以下 NHibernate 映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Examples" assembly="Examples">
  <class name="Customer">
      <id name="Id">
        <generator class="guid.comb" />
      </id>
      <property name="Name" length="50"/>
      <set name="Orders" table="CustomerOrder" cascade="all-delete-orphan" lazy="true">
        <key column="CustomerId"/>
        <many-to-many class="Order" column="OrderId"/>
      </set>
  </class>
</hibernate-mapping>

这个测试有什么价值吗?

[Test]
public Save_NameWritten_SameNameIsReadback()
{
    var expected = new Customer { Name = "Fred Quimby" };
    _repo.Save(c);
    var actual = _repo.Find(expected.Id);
    Assert.AreEqual(expected.Name, actual.Name);
}

人们通常会这样测试他们的持久层吗?确保每个字段都单独保存?老实说,我不确定这样的最佳实践是什么。我可以看到用长字符串和父/子关系测试一些东西——但是整数和日期呢?这是大材小用吗?

我这里只说持久层,而不是领域层中的业务逻辑。为此,我将模拟存储库,而在这里我验证存储库是否确实保存了我告诉它保存的内容。如果有人忘记映射字段,或者映射中有虚假的字符串长度怎么办?

是否有任何工具可以在 .NET 中自动生成这些类型的测试?还是说“不好”?

【问题讨论】:

    标签: c# nhibernate tdd domain-driven-design


    【解决方案1】:

    如果您确保在不同的会话中保存和获取数据,那么您可以有效地确保您的映射正确 - 这就是价值。

    最好的办法是在内存数据库中使用类似 PersistenceSpecification(这里有一个关于它的post),来自流利的 NHibernate,它可以在不同的会话中为您插入和选择数据。

    【讨论】:

      【解决方案2】:

      这些测试具有很大的价值,因为它们最终是验证您是否真的可以与数据库对话的唯一方法。一旦你确认你有一个工作存储库,你可以在其他单元测试中模拟对存储库的调用,正如你所提到的。

      注意独占使用内存数据库 - 因为您需要知道您的目标数据库可以正常工作。还要注意这些测试中的会话使用。如果您真的想在加载时访问数据库,请确保保存和查找发生在不同的会话中。

      您可以使用这些连接的数据库测试来验证几件事:

      • 字符串的边界长度
      • 延迟加载。您可以使用分离的会话来验证您是否获得了您不想急切加载的连接对象的延迟加载异常,反之亦然。这对于更复杂的域层次结构很重要,因为有人无意中添加了通过对象图的导航路径,从而导致加载整个数据库。
      • 外键和唯一约束。
      • 搜索调用具有大型数据集的存储库的效率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 2013-04-07
        • 2011-01-01
        • 1970-01-01
        相关资源
        最近更新 更多