TDD和服务(类什么做但什么都没有回来)

时间:2009-03-24 19:23:04

标签: tdd mocking

我正在尝试在Service类的开发过程中跟踪TDD(我是newbee),它构建了Service客户端传递的任务。然后将构建的对象传递给其他系统。换句话说,此服务接受任务但不返回任何结果 - 它将构建的任务传递给其他服务。 所以我想知道如何为它编写测试,因为没有什么可以断言的。 我正在考虑使用模拟来跟踪服务中的交互,但我有点害怕使用模拟,因为我将与服务的内部实现相关联。

提前感谢大家!

3 个答案:

答案 0 :(得分:2)

使用模拟没有问题,因为您实际上将模拟组件内部使用的组件的外部接口。这实际上就是模拟的目的,听起来像是一个完美的用例。

在进行TDD时,它还应该允许您获得被认为是良好实践的快速周转周期,因为您可以创建这些外部服务的模拟。这些模拟很容易让你编写另一个失败的测试。

答案 1 :(得分:1)

您可以考虑在几个课程中分解它。一个负责构建将要执行的任务列表,另一个负责执行它所执行的任务列表。这样,您就可以直接测试构建任务列表的代码。

那就是说,我想在另一个question上添加一个样本,关于在涉及外部系统时如何查看TDD过程。

  

让我们说你必须检查一下   一些给定的逻辑发送电子邮件,日志   文件上的信息,保存数据   数据库,并调用Web服务(不是   我知道,但你就开始了   为每个人添加测试)。上   每次测试你都不想打   外部系统,你真正想要的   测试是否逻辑将成为   打电话给你那些系统   期待它做。所以当你写作   检查电子邮件的测试   在创建用户时发送,你是什么   测试是逻辑调用的   依赖于那样做。请注意   你可以写这些测试和   相关的逻辑,没有实际的   实现发送的代码   电子邮件(然后必须访问   外部系统知道发送了什么   ...)。这将有助于您专注于   手头的任务,帮助你获得一个   解耦系统。它也会成功   很容易测试发送的内容   那些系统。

答案 2 :(得分:0)

不确定您使用的语言是什么,所以在psuedo-code中它可能是这样的:

when_service_is_passed_tasks
  before_each_test
    mockClients = CreateMocks of 3 TaskClients
    tasks = GetThreeTasks()
    myService = new TaskRouter(mockClients)

  sends_all_to_the_appropriate_clients
    tasks = GetThreeTasks()
    myService.RouteTaks(tasks)
    Assert mockClients[0].AcceptTask(tasks[0]) was called
    Assert mockClients[1].AcceptTask(tasks[1]) was called
    Assert mockClients[2].AcceptTask(tasks[2]) was called

  if_one_routing_fails_all_fail
    tasks = GetTasksWhereOneIsFailing()
    myService.RouteTaks(tasks)
    Assert mockClients[0].AcceptTask(*) was not called
    Assert mockClients[1].AcceptTask(*) was not called
    Assert mockClients[2].AcceptTask(*) was not called