我觉得将TDD当作一个如何使用某些东西的例子很有帮助,为什么这个行为很有趣。
因此,例如,在你的应用程序,你可能有这样的行为:
它的创建当A显示与导演有关。
然而,这不是很有趣。为什么这很有价值?它在哪里使用?如果您可以展示某些重要的行为方面,那更有意思。
一个节目的声誉开始了与它的导演的声誉。
然后,您可以编写此行为的例子:
Given a director with a reputation of 75%
When he creates a new show
Then the show should start with a reputation of 75%.
这将是更有趣的行为。我们实际上可以创建一个具有这种声誉的节目,而不使用Hibernate。我有时候会把这样的例子作为测试中的评论。 (我用这个作为例子,因为我不知道为什么用导演创建节目对你来说很重要!)
对于像NHibernate这样的东西,要么使用覆盖整个应用程序的全栈场景,要么集成测试只需通过与其导演构建一个节目来检查映射,或者手动检查应用程序的工作情况。如果你正确地使用NHibernate,你可以假设NHibernate将继续工作,所以与你将要改变的代码相比,你需要更少的测试。
我的经验是,它是确定以创建真正的域对象(显示,导演等),而不是嘲笑他们。但是,如果您有任何复杂的计算 - 例如,计算一次Show一旦开始几个晚上的声望可能会很复杂 - 那么您可以注入一个模拟来帮助解决这个问题,并且您的行为也会相应改变:
A show uses the reputation rules for its reputation
// Given the reputation rules
(mock out the reputation)
// When a show is created with a director
(create the show)
// And it's shown for 3 nights with varying reviews
(associate the reviews with the show)
// Then it should use the rules to calculate its reputation
(verify that when you get the reputation, the show asks the mock for help).
希望这可以让你知道它在哪里可能是有用的嘲笑,以及它可能不需要。这越练习越自然。
谢谢你的有用答案。 完全测试实体的目的是检查映射文件的健康性等,但在阅读您的解释之后,我认为它应该在集成测试中进行分类,并且不能进行单元测试。我对吗 ? – sos00
绝对 - 做一个集成测试。映射文件的行为只有在与真实数据库一起使用时才有价值。 – Lunivore