单元测试数据模型:相关实体



我是单元测试新手& &;在阅读了一些文章之后,我决定在我的一个小项目中开始TDD。它是一个简单的剧院门票预订,使用NHibernate;还有存储库模式。我决定首先为我的数据模型编写一些测试,所以我从对实体进行简单的CRUD操作开始。我面临的第一个问题是具有多对一关系的实体。例如,我有一个Show实体,它与Director实体有多对一的关联(每个Show都有一个Director),所以为了测试Show。我必须先创建一个Director实体来给他分配Show。

既然单元测试强烈反对编写依赖测试,我怎么能在不依赖于这些相关实体的情况下解决这个问题呢?

我发现把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这样的东西,要么使用覆盖整个应用程序的全栈场景,要么使用集成测试,通过构造一个show来检查映射,或者手动检查应用程序是否正常工作。你可以假设如果你以正确的方式使用它,NHibernate会继续工作,所以你需要的测试比你要修改的代码要少。

我的经验是,创建真正的域对象(Show, Director等)而不是模拟它们是可以的。然而,如果您有任何复杂的计算—例如,可能在一个节目播放了几个晚上之后计算它的声誉是很复杂的—那么您可以注入一个mock来帮助解决这个问题,并且您的行为将相应地改变:

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

希望这能给你一个想法,在哪里它可能是有用的嘲笑,而在哪里你可能不需要。练习得越多,就越自然。

创建一个IDirector接口,并将其放入Show Entity的构造函数中。这样,您就可以在分配给演出之前创建Director的模型(测试)实现。只需使用一些虚拟数据或我们的Rhino mock自己实现icdirector接口即可。示例请参见http://haacked.com/archive/2006/06/23/usingrhinomockstounittesteventsoninterfaces.aspx

最新更新