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.请不要犹豫,询问更多信息,因为我一直在努力寻找可能的最佳实践.我最接近的是:
这样可行,但我的蜘蛛感觉刺痛,我认为我做错了,因为测试代码会涉及逻辑,如果没有测试,处理起来会非常复杂.
编辑2:我会尽力让自己更清楚.当我编写/运行我的单元和一些集成测试时我没有问题,因为测试数据没有持久化,它存在于内存中.
但是当我试图坚持我的测试数据时,如果没有它的关系,hibernate将不会让我保存一个实体.
我怎样才能克服这个问题?
您需要更好地定义域上的级联。如果您无法测试它,您预计它在实际应用中的表现如何?
例如:
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 实现我的存储库,并让它们每个获得一个会话。这样您就可以将“工作单元”模式纳入您的设计中。
祝你好运:)
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |