0

它(几乎)是我第一次尝试按照 TDD 原则创建代码。但我有麻烦如何开始。

例如:我想改变一些关于一个人的信息。

为方便起见,一个人只有以下值: - FirstName - LastName - Email

我最后需要什么: - 一个人 DTO - 一个人实体(Nhibernate) - 将 dto 值存储在数据库中的功能。最后我需要返回一个成功或一个错误(可能是一个布尔值)。

有了给定的信息,如何开始呢?这是一个全球性的问题,但那是因为我不知道如何开始。我有很多文章,但不知何故我已经卡住了。

编辑: - 我正在使用 MVC:MVC 将返回一个 DTO(从表单字段填充)。

所以 MVC 开始调用可能是这样的:

public JsonResult MutatePerson(PersonDto person){
    //Call functions by TDD here
    return Json(true);
}
4

3 回答 3

1

使用 TDD,您应该使用接口作为参数。可以模拟接口,并通过模拟测试 MutatePerson 方法,仅此而已。在单元测试中,您只想测试方法对输入的反应,而不是对象对方法的反应。如果您还测试 DTO 对象的行为方式,那么您正在编写集成测试。

因此,使用PersonDto(如果不存在则创建一个)的接口。并将其用作方法参数而不是具体类。

于 2012-11-06T11:41:27.147 回答
1

您已经描述了所涉及的对象,但没有描述操作。

大概你需要一个read()手术,一个write()手术。也许是list()手术?

以上所有内容都应该有与之相关的测试,例如

testCanReadViaId();
testCanThrowExceptionOnReadingInvalidId();
testCanWrite();

等等

对于很多工作,您应该模拟您的数据源等,并在您的持久层下放置(例如)硬编码数据,这样您就不会依赖数据库。然而,对于上述情况,我肯定会测试基本的数据库交互。

因此,您可能需要(最初)将测试套件指向带有预设数据的数据库。如果您想要更灵活,那么您的测试设置代码可以在运行测试之前先将实体写入数据库。

您的测试应该测试数据和操作的不同排列,例如在上面我建议通过有效 id(例如,1)和针对无效 id(例如,-1)的类似操作来读取对象的测试。您可能还想检查不同的数据组合(例如,如果未填充电子邮件地址,一切是否正常 - 如果数据库列可以为空,这可能是有效的)

于 2012-11-05T13:13:36.103 回答
1

可能只有我一个人,但我感觉你一开始对你的全局系统在层、模块以及它们之间的依赖关系和交互方面应该是什么样子一无所知。

TDD 的紧急设计确实可以在小对象图的级别上工作,但是如果不先进行一些整体架构设计(不是大的前期设计,但足以让您入门),您将无法逃脱。

考虑到这一点,我认为您将对要测试的内容有一个更好的想法。

一旦你弄清楚了,我认为你应该:

  • 了解面向对象的单元测试技术,单元测试是指孤立地测试事物。Roy Osherove 的单元测试艺术对于 .NET 开发人员来说是一个很好的起点。

  • 了解架构级 TDD 策略。通过您阅读的文章,您肯定对如何在小范围内进行 TDD 有所了解,但是您需要一种更全局的方法:您应该首先进行什么 TDD,以什么顺序等。像GOOS这样的书可能会帮助您在该部门。

于 2012-11-06T15:56:46.847 回答