『テスト駆動開発』第1部をC#で写経してみる(第2章)

第2章 明白な実装 (Degenerate Objects)

第1章に引き続き進めていく。

Dollarオブジェクトの times メソッドに以前とは異なる引数を渡し、期待値が得られるかを確認したい。現段階ではどう考えてもテストは失敗するのだが、失敗させるのが重要なのでテストを追加してみる。

namespace TddStudyTest
{
    [TestClass]
    public class MoneyTest
    {
        [TestMethod]
        public void TestMultiplication()
        {
            Dollar five = new Dollar(5);
            five.times(2);
            Assert.AreEqual(10, five.amount);
            five.times(3);
            Assert.AreEqual(15, five.amount);
        }
    }
}

テストを実行し、失敗することを確認後、即座にグリーンバーを目指すため、times メソッドに対して以下の修正を行う。

  • 戻り値をDollarクラスに変更
  • multiplieramout を掛け合わせて新しい金額のDollarオブジェクトを返す
namespace TddStudy.Money
{
    public class Dollar
    {
        public int amount;

        public Dollar(int amount)
        {
            this.amount = amount;
        }

        public Dollar times(int multiplier)
        {
            return new Dollar(this.amount * multiplier);
        }
    }
}

上記修正に伴いテストは以下のようになる。

namespace TddStudyTest
{
    [TestClass]
    public class MoneyTest
    {
        [TestMethod]
        public void TestMultiplication()
        {
            Dollar five = new Dollar(5);
            Dollar product = five.times(2);
            Assert.AreEqual(10, product.amount);
            product = five.times(3);
            Assert.AreEqual(15, product.amount);
        }
    }
}

これでグリーンバーが復活した。

雑感

第1章ではベタ書きの値を徐々に変数に置き換えていく仮実装を行ったが、今回はいきなり実装に入る明白な実装を行った。具体例から徐々に抽象度を上げていく仮実装の方がセーフティーということか。

しかしテストコードの修正から入るというのにはまだまだ慣れそうにない。

カテゴリーTDD

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です