坚持复杂的测试数据

nim*_*cap 7 testing persistence test-data fluent-interface

我们使用构建器模式生成测试数据.这些域对象之间存在关系.我们的功能测试要求保留这些对象.

想想这个模型:

域模型http://i34.tinypic.com/21mg1gn.png

如果我想要一个普通的CI实例 aNew().c().build()

如果我希望它坚持我做 aNew().c().saveIn(session)

如果我想要一个具有已知BI的C实例 aNew().c().with(b).build()

嗯,你明白了.我的问题是,如果我想坚持一个C,它应该坚持它的B吗?或者它应该在手前坚持下去?如果我想要一个合理的默认B呢?如果我想坚持D怎么样?它应该坚持A,B,C吗?

当然,真实的系统要复杂得多(有时带有循环引用).我正在寻找持久复杂测试数据的最佳实践.

编辑:看起来我遇到了语言障碍,我的母语不是英语,所以我很抱歉默默无闻.以下是更多信息:

  • 它不是我试图测试的遗留代码
  • 我正在尝试编写覆盖测试,而不是单元测试(因此我不会嘲笑任何东西)
  • 如果数据库填充到某种程度(它不使用所有实体),我试图测试的软件工作.

PS.请不要犹豫,询问更多信息,因为我一直在努力寻找可能的最佳实践.我最接近的是:

  1. 跟踪构建实体时明确设置的内容.
  2. 假设显式设置的实体已经保留,请不要保留它们.
  3. 坚持一切(用他们自己的毅力).

这样可行,但我的蜘蛛感觉刺痛,我认为我做错了,因为测试代码会涉及逻辑,如果没有测试,处理起来会非常复杂.

编辑2:我会尽力让自己更清楚.当我编写/运行我的单元和一些集成测试时我没有问题,因为测试数据没有持久化,它存在于内存中.

但是当我试图坚持我的测试数据时,如果没有它的关系,hibernate将不会让我保存一个实体.

我怎样才能克服这个问题?

cwa*_*wap 1

您需要更好地定义域上的级联。如果您无法测试它,您预计它在实际应用中的表现如何?

例如:

A -> B:这段关系的所有者是谁?您想将 B 添加到 A 中,还是反之亦然?这可以是一个实现细节,您可以同时拥有 B.SetParent(A) 和 A.Children.Add(B),并且在 A.Children.Add(B) 的情况下将 B 的父级设置为 A(同样,另一个)方式)。如果你这样做会发生什么:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.Children.Add(b);
b.SetParent(a);
Run Code Online (Sandbox Code Playgroud)

你需要在这里下定决心。没有一个解决方案是完美的,因此这里适用的基本上是个人偏好和应用程序一致性。

使用 ORM 比使用纯 SQL(或任何其他数据源,如 XML 或您自己的数据源)更快地遇到这些约束问题,但如果您也编写纯 SQL,则需要考虑这些问题。

很抱歉,我没有给你一个明确的答案,但对我来说,你似乎需要考虑一些(我认为)你还没有完成的约束。

就个人而言,我喜欢在 DAL 中使用 NHibernate 时的存储库模式。我从 IDisposable 实现我的存储库,并让它们每个获得一个会话。这样您就可以将“工作单元”模式纳入您的设计中。

祝你好运:)