Exercise: Slipping A Listening Fake
Slipping A Shipper Stub Solution
We wrote fake shipper inside
ShippingOrderTest
, just where we need it:
static Money fakeShipperTotal(Shipper* shipper)
{
return initMoney(0);
}static void fakeShipperAddItem(Shipper* shipper, const char* sku, int quantity, Weight weight)
{
}ShipperBehavior fakeBehavior = { &fakeShipperTotal, &fakeShipperAddItem };Shipper* fakeShipperCreate(const char* orderId, ShippingOption option)
{
Shipper* result = shipperCreate(orderId, option);
result->behavior = &fakeBehavior;
return result;
}
To pull off the slip we used the "Parameterize Method" technique, which basically separates creation from usage. Instead of one version of
prepareToShip()
, now we have two:
- The first one takes a
Shipper
as an argument. - The second one creates the
Shipper
object and passes it into the first one. - We then code our tests against the first one.
// ShippingOrder.cvoid shippingOrderPrepareToShipWithShipper(ShippingOrder *shippingOrder, Shipper *shipper)
{
LineItem *item = orderGetItems(shippingOrder->m_baseOrder);
while (item != NULL)
{
shipperAddItem(shipper, lineItemGetSku(item), lineItemGetQuantity(item),
lineItemGetExtendedWeight(item));
item = item->m_nextItem;
}
shippingOrder->m_shippingTotal = shipperTotal(shipper);
}void shippingOrderPrepareToShip(ShippingOrder* shippingOrder)
{
Shipper* shipper = shipperCreate(orderGetOrderId(shippingOrder->m_baseOrder),
shippingOrder->m_option);
shippingOrderPrepareToShipWithShipper(shippingOrder, shipper);
shipperDestroy(shipper);
}
static Shipper* shipper = NULL;static void setUp(void)
{
…
shipper = fakeShipperCreate(orderGetOrderId(baseOrder), ShippingOption_AIR);
}static void tearDown(void)
{
shippingOrderDestroy(shippingOrder);
shipperDestroy(shipper);
}...static void testShippingAmountSingle(void)
{
orderAdd(baseOrder, oneLarge);
shippingOrderPrepareToShipWithShipper(shippingOrder, shipper); ASSERT_TRUE(moneyEquals(initMoney(1), shippingOrder->m_shippingTotal));
}static void testShippingAmountMultiple(void)
{
smallProduct = productCreate("SKU002", "Small Widget", initMoney(4.56), initWeight(0.10));
oneSmall = lineItemCreate(smallProduct, 1); orderAdd(baseOrder, oneLarge);
orderAdd(baseOrder, oneSmall);
shippingOrderPrepareToShipWithShipper(shippingOrder, shipper);
ASSERT_TRUE(moneyEquals(initMoney(2), shippingOrder->m_shippingTotal));
}
(Reading...)
Formatting Hints:
To format... | use this markup: |
---|---|
source code | {source:lang=java|lineNumbers=false}...{source} (Supported languages: java, cpp, csharp, c, python.) |
bold text | __some text__ |
italicized text | ~~some text~~ |
underlined text | @@some text@@ |
a method or class name | ``myMethod(...)`` |