gpt4 book ai didi

unit-testing - 单元测试数据模型 : related entities

转载 作者:行者123 更新时间:2023-12-04 04:46:42 24 4
gpt4 key购买 nike

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

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

最佳答案

我发现将 TDD 视为编写一个示例,说明如何使用某物,以及为什么该行为有趣。

因此,例如,在您的应用程序中,您可能有以下行为:

A show is associated with a director when it's created.

然而,这并不是很有趣。为什么这很有值(value)?它在哪里使用?如果您可以展示行为的某些重要方面,那就更有趣了。

A show's reputation starts off with its director's reputation.

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

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 等)而不是模拟它们是可以的。然而,如果你有任何复杂的计算——例如,一旦一个节目已经播出了几晚,计算它的声誉可能会很复杂——那么你可以注入(inject)一个模拟来帮助解决这个问题,你的行为将相应地改变:

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

希望这能让您了解模拟在哪些地方可能有用,在哪些地方可能不需要。你练习得越多,这就会变得越自然。

关于unit-testing - 单元测试数据模型 : related entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com