单元测试datamodel:相关实体

时间:2011-09-25 19:46:08

标签: unit-testing nhibernate tdd

我是单位测试的新手。 TDD和读完一些文章之后我决定在我的一个小项目中开始TDD。这是一个简单的剧院门票预订,使用NHibernate&还有存储库模式。我决定先为我的数据模型编写一些测试,所以我开始对实体进行简单的CRUD操作。我遇到的第一个问题是具有多对一关系的实体。例如,我有一个显示实体,它与导演实体有多对一的关联(每个Show有一个导演),所以用于测试Show.Create方法我不得不创建一个Director实体,首先为他分配Show。

由于单元测试强烈反对编写依赖测试,如何在不依赖于此类相关实体的情况下克服此问题?

2 个答案:

答案 0 :(得分:3)

我发现将TDD视为如何使用某些内容的示例以及行为有趣的原因是有帮助的。

例如,在您的应用程序中,您可能会遇到以下行为:

  

一个节目在创建时与导演相关联。

但是,这不是很有趣。为什么这很有价值?在哪里使用?如果你能展示一些重要的行为方面,那就更有趣了。

  

一个节目的声誉始于其导演的声誉。

然后,您可以编写此行为的示例:

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会继续工作,所以与你要改变的代码相比,你需要更少的测试。

我的经验是创建真正的域对象(Show,Director等)而不是模拟它们是可以的。但是,如果您有任何复杂的计算 - 例如,一旦显示一个Show的声誉可能有很多复杂性,那么您可以注入一个模拟来帮助解决这个问题,并且您的行为会相应地改变:< / p>

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).

希望这可以让您了解模拟可能有用的地方,以及您可能不需要的地方。你练习的越多,这就越自然。

答案 1 :(得分:0)

只需创建一个IDirector接口,您将放入Show Entity的构造函数中。这样,您可以在分配到节目之前创建Director的模型(测试)实现。只需使用一些虚拟数据或我们的Rhino Mocks实现IDirector接口。有关示例,请参阅http://haacked.com/archive/2006/06/23/usingrhinomockstounittesteventsoninterfaces.aspx