TDD在购物车应用中

时间:2013-09-08 10:40:57

标签: tdd

所以我有一个模拟购物车服务的学术问题。

购物车支持添加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();

等等

谢谢:)

2 个答案:

答案 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,这意味着您已按照以下步骤操作:

  1. 编写失败的单元测试
  2. 使失败的测试通过
  3. 重构
  4. 您正面临一个有趣的问题,通常是因为没有遵循完整的TDD测试周期。这将是:

    1. 撰写失败的验收测试
    2. 编写失败的单元测试
    3. 使失败的测试通过
    4. 重构
    5. 重复步骤2-4,直至验收通过失败
    6. 验收测试是一种端到端的测试,它应该贯穿整个应用程序堆栈(例如,从UI通过商务逻辑到数据库并返回)。这是为代码提供结构所必需的。它允许您定义代码中缺少的部分以及您需要实现的协作者。它还创建了一个指南,使您可以将编程重点放在应用程序的必要部分。

      如果您打算学习TDD,您可能想花些时间学习Growing Object-Oriented Software, Guided by Tests。它将为您提供使TDD正常运行所需的一切。