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