找到单一责任原则违规时的Tdd工作流程

时间:2014-08-06 14:25:30

标签: tdd single-responsibility-principle

我试图关注TDD。所以这是我的问题

我的方法

的接口风险
boolean check(...)

Risk1和Risk2是实施首先发布的测试,所以现在它们已完全覆盖。 我决定检查所有风险的单位( CompositeRisk )也可以实现 Risk 。 CompositeRisk对每个Risk1和Risk2 rezult应用OR(如果一个风险为真,那么整个风险是有风险的)。仍然一切都是先测试。

现在我正在寻找其中一个风险和思考 - 这个有一个词" AND"并检查不同的字段。似乎我可以将它拆分为两个对象并再创建一个 CompositeAndRisk ,它将对两个分裂的风险应用And。这样我就可以为风险决策树构建DSL(看起来不错,因为风险规则可能会发生很大变化)。

那么我应该对风险进行分裂测试?我应该将我重命名为CompositeAndRiskTest吗?我应该删除吗?,我应该为splitClasses编写测试吗?

2 个答案:

答案 0 :(得分:2)

首先,我建议您将CompositeRisk类转换为一个接口,并有两个独立的子类:CompositeOrRiskCompositeAndRisk。这只是关于设计的。

关于你的问题,我相信没有单一的正确答案,所以让我分享一下我的看法。
如您所知,在TDD中,您遵循了具体步骤(包括TDD循环),并且测试应该在每个步骤之间存在特定状态。这就是我的意思:

[State = No tests]  
1. Write a test that fails  
[State = Test fails]
2. Write as little code as possible in order for the test to pass  
[State = Test passes]  
3. Refactor  
[State = Test still passes]

鉴于这是我们在TDD中的目标,我会在重构阶段进行您正在讨论的更改,包括相应地重构测试。
这意味着如果我拆分一个班级,我也会拆分相关的考试。在任何时候都不应该测试失败,因为我只改变代码的结构,而不是改变代码的结构(这毕竟是重构的意思)。

如果你有更大的改变,我会从头开始创建一个新类(当然是TDD),稍后,从旧类中删除不再需要的功能,以及现在多余的测试案例。

答案 1 :(得分:1)

我在这种情况下采取的方法是" 扮演无辜的" - 当您发现新要求时,只需编写测试及其实现,假装首先忽略与先前要求的关系。

"和"这里的案例显然是新功能。此时无需修改现有测试的内容,只需创建另一个具有反映新需求的名称的测试,例如CompositeAndRiskTest并创建相应的实现。

然后,在Refactor步骤中,"实现"以前的两个物体是同一枚硬币的两面并相应地重构它们。这可能意味着将CompositeRisk重命名为CompositeOrRisk,或更复杂的事情。

一旦识别,测试和实施了2种风险,您就可以继续为它们的组合创建新的测试。