HackerTube English?
主题阅读

测一条业务规则,为什么要连数据库?

把「谁该收到提醒」单独拿出来,就能分别检查规则是否正确、通知能否送达。

一位用户昨天到期,另一位明天到期。你想检查今天该提醒谁,测试却得先准备数据库和邮件服务。Gary Bernhardt 在《Boundaries》里把这个问题拆成了两件可以分别做的事。

把作决定需要的东西摆在桌上

外层读取用户记录,把记录交给判断到期的代码,再按返回的结果发送邮件。现在只要给判断逻辑两份记录和一个明确的日期,就能核对它选了谁。外层仍需要一次接入真实依赖的检查,比如确认查询结果能交给这条规则使用。

the expired users class makes all the decisions and the sweeper class has all the dependencies.
Gary Bernhardt · Boundaries · 英文字幕
回看原片 15:28–15:38 →

藏在方法里的「今天」

Rich Hickey 给了一个可用于检查这种拆分的条件:同样的输入应当产生同样的输出。设想我们把函数叫作「找出到期用户」,传进去的却只有用户记录。如果它在内部读系统时间,同一份记录在午夜前后会给出不同答案。把判断日期也作为参数,测试就能重现那个午夜。

a true functional interface, same input, same output.
Rich Hickey · Simple Made Easy · 英文字幕
回看原片 37:13–37:21 →

两段放在一起,可以帮助我们找遗漏的输入。下次为了测一个判断而替换数据库、时钟和邮件服务时,可以先问:决定答案究竟需要哪些值?把这些值写成一个小例子,再单独检验真实系统能否提供它们。