在本系列之前的文章中,我解释了为什么一次性解决所有编码问题,就像对待成群的僵尸一样,是一个错误。我正在使用一个有用的首字母缩略词来解释为什么以增量方式处理问题更好。 ZOMBIES 代表
Z – 零
O – 一
M – 多 (或更复杂)
B – 边界行为
I – 接口定义
E – 执行异常行为
S – 简单场景,简单解决方案
在本系列的前三篇文章中,我演示了前五个 ZOMBIES 原则。第一篇文章实现了Zero,它提供了通过代码的最简单路径。第二篇文章使用One 和 Many 样本进行了测试,第三篇文章着眼于Boundaries 和 Interfaces。在本文中,我将看看我们首字母缩略词中的倒数第二个字母:E,它代表“执行异常行为”。
实践中的异常行为
当您编写像本示例中的电子商务工具这样的应用程序时,您需要联系产品负责人或业务赞助商,以了解是否需要实施任何特定的业务策略规则。
当然,与任何电子商务运营一样,您都希望制定业务策略规则来吸引客户继续购买。假设已沟通一项业务策略规则,即任何总额超过 500 美元的订单都可享受百分比折扣。
好的,是时候卷起袖子,为这项业务策略规则制定可执行的预期了
[Fact]
public void Add2ItemsTotal600GrandTotal540() {
var expectedGrandTotal = 540.00;
var actualGrandTotal = 0.00;
Assert.Equal(expectedGrandTotal, actualGrandTotal);
}
编码业务策略规则的确认示例表明,如果订单总额为 600.00 美元,则 shoppingAPI
将计算总额并将其折扣至 540.00 美元。上面的脚本伪造了预期,只是为了看到它失败。现在,让它通过
[Fact]
public void Add2ItemsTotal600GrandTotal540() {
var expectedGrandTotal = 540.00;
Hashtable item = new Hashtable();
item.Add("00000001", 200.00);
shoppingAPI.AddItem(item);
Hashtable item2 = new Hashtable();
item2.Add("00000002", 400.00);
shoppingAPI.AddItem(item2);
var actualGrandTotal = shoppingAPI.CalculateGrandTotal();
Assert.Equal(expectedGrandTotal, actualGrandTotal);
}
在确认示例中,您添加了一件定价为 200 美元的商品和另一件定价为 400 美元的商品,订单总额为 600 美元。当您调用 CalculateGrandTotal()
方法时,您期望获得的总额为 540 美元。
这个微测试会通过吗?
[xUnit.net 00:00:00.57] tests.UnitTest1.Add2ItemsTotal600GrandTotal540 [FAIL]
X tests.UnitTest1.Add2ItemsTotal600GrandTotal540 [2ms]
Error Message:
Assert.Equal() Failure
Expected: 540
Actual: 600
[...]
好吧,它惨败了。您期望得到 540 美元,但系统计算出 600 美元。错误的原因是什么?这是因为您尚未教导系统如何计算超过 500 美元的订单总额的折扣,然后从总额中减去该折扣。
实施该处理逻辑。从上面的确认示例来看,当订单总额为 600.00 美元(大于订单总额为 500 美元的业务规则阈值)时,预期的总额为 540 美元。这意味着系统需要从总额中减去 60 美元。而 60 美元恰好是 600 美元的 10%。因此,处理折扣的业务策略规则期望对所有超过 500 美元的订单总额提供 10% 的折扣。
在 ShippingAPI
类中实现此处理逻辑
private double Calculate10PercentDiscount(double total) {
double discount = 0.00;
if(total > 500.00) {
discount = (total/100) * 10;
}
return discount;
}
首先,检查订单总额是否大于 500 美元。如果是,则计算订单总额的 10%。
您还需要教导系统如何从订单总额中减去计算出的 10%。这是一个非常简单的更改
return grandTotal - Calculate10PercentDiscount(grandTotal);
现在所有测试都通过了,您再次享受着持续的成功。您的脚本执行异常行为以实现所需的业务策略规则。
还剩最后一个
我已经带我们完成了 ZOMBIE,现在只剩下 S 了。我将在激动人心的系列结局中介绍它。
2 条评论