所以我有一个模拟购物车服务的学术问题。
购物车支持添加OrderItem,另外还有计算特定购物车总价的另一项责任。这是通过组合和委托给IPricingCalculator来完成的
public class Cart
{
private List<OrderItem> _items;
private IPricingCalculator _pricingCalculator;
public Cart(IPricingCalculator pricingCalculator);
public addItem(OrderItem);
public double totalPrice()
{
double price = 0.0;
for (OrderItem orderItem: _items)
price += _pricingCalculator.getPrice(orderItem);
}
}
IPricingCalculator支持getPrice方法
public interface IPricingCalculator
{
double getPrice(OrderItem item);
}
CustomPriceCalculator实现了IPricingCalculator接口
public class CustomCalculator implements IPricingCalculator
{
private List<IPriceRule> _priceRules;
public double getPrice(OrderItem item); // return the price according to the first rule that matches
}
现在我已经以TDD方式实现了CustomCalculator, 这些是我的一些测试:
@Test
public void FreeItemCostNothing();
public void SpecialItemCostHalf();
public void BulkPurchaseCostsQuater();
等等。
我很确定CustomCalculator工作正常。
但我不明白根据TDD应该是我实现Cart的下一步,所有Cart应该做的是管理OrderItem的集合并折叠集合上的getPrice方法。我是否应该为这两个课程提供相同的详尽测试套件?
即使购物车的测试也包括以下测试 -
@Test
public void TenFreeItemCostNothing();
public void FiveSpecialItemsAndBulkPurchaseCostsHalfAndQuarter();
等等
谢谢:)
答案 0 :(得分:0)
我认为你最能回答你的问题。
您应该编写测试来测试Cart
需要支持的两件事。
@Test
public void AddOrderItemToCart(); /* I don't see these in the interface, but... */
public void DeleteOrderItemFromCart();
public void GetPriceMethodIsCorrectlyCalled();
public void AllOrderItemsArePricedAndTotalCalculated();
这些测试可以通过验证模拟来验证调用(不确定这是否适用于您正在使用的语言(Java或C#)),或者调用实际实例并确保结果正常。您不应再次测试OrderItem或CustomCalculator
的实现,只是正确调用它。
答案 1 :(得分:0)
据我了解您的说明,您已经以测试为导向的方式实施了CustomPriceCalculator
,这意味着您已按照以下步骤操作:
您正面临一个有趣的问题,通常是因为没有遵循完整的TDD测试周期。这将是:
验收测试是一种端到端的测试,它应该贯穿整个应用程序堆栈(例如,从UI通过商务逻辑到数据库并返回)。这是为代码提供结构所必需的。它允许您定义代码中缺少的部分以及您需要实现的协作者。它还创建了一个指南,使您可以将编程重点放在应用程序的必要部分。
如果您打算学习TDD,您可能想花些时间学习Growing Object-Oriented Software, Guided by Tests。它将为您提供使TDD正常运行所需的一切。