C# テスト駆動開発の実践方法:サービスクラスの実装をしよう-2- #16

当連載ではテスト駆動開発を実践するために必要な基礎知識や実践方法を解説しています。現在は実践編として簡単なアプリケーションを作成しながらテスト駆動開発のやり方を解説しています。

過去の記事については「C# テスト駆動開発の実践方法」から確認できますので、テスト駆動開発について詳しく知りたい人は参考にしてみてください。前回はBankServiceとして残高の照会機能を作成しました。今回は入金機能を作成していきたいと思います。

入金機能を考えよう

まず入金機能のユースケースを考えていきましょう。大まかな機能として実現できれば良い内容は「残高に入金された金額を追加してファイルに出力し、最新の口座残高とすること」になりますよね。入金機能として最低限これだけあれば十分に思いますので、早速テストコードから記述していきましょう。BankServiceTestクラスを開いて作業していきます。

テストコードのコーディングをする

BankServiceTest.csにて新規のテストメソッドを作成して以下のようなテストを記述しておきます。テスト内容としては、元の金額と新規の金額を足し合わせた金額がファイルに出力されていればOKになります。

[TestMethod]
public void AddBalance_OK()
{
    //初期金額
    string writePath = @"C:\temp\balance.txt";
    string text = ((int)100).ToString();
    File.WriteAllText(writePath, text);

    string path = @"C:\temp\balance.txt";
    var repository = new BankRepository(path);
    var service = new BankService(repository);

    //入金金額
    service.AddBalance(new Money(100));

    //残高照会
    var balance = service.GetBalance();
    Assert.IsTrue(balance.Equals(new Money(200)));
}

初期金額を100円として追加入金が100円としたとき、再度残高照会をすると200円になっているはずです。それを上記のテストメソッドとして作成しました。金額は任意ですので好きな金額に変更してもらってもかまいません。

コンパイルエラーをレッドにする

さてテストメソッドが記述できたので、次はコンパイルエラーの状態からレッドを目指します。現状ではテストメソッド内に記述しているAddBalanceメソッドが存在していないためエラーになっています。この状況を解決しましょう。

AddBalaceメソッドは今のところvoid型ですが、AddBalanceした戻り値としてMoneyクラスを返した方が使い勝手が良さそうですね。ファイルに書き込むまでを一連の流れにしますが、書き込んだ内容を返却するようにすれば、最新の残高を再度ファイルアクセスして検索する必要はなくなります。

public Money AddBalance(Money add)
{
    return add;
}

BankServiceにいったん仮のAddBalanceメソッドを記載しておき、まずはレッドの状態を目指します。上記のメソッドを追加すれば、コンパイルエラーが解消できるはずですので、この状態でテストを実行してレッドになるかを確認しましょう。

レッドからグリーンにする

レッドの状態になることを確認出来たら、次はグリーンの状態を目指します。入金処理を分解すると以下のようにすることができます。

  • 現在の残高を問い合わせる
  • 入金金額を足し合わせる
  • 最新の残高をファイル出力する
  • 最新の残高を返却する

この4段階に分けることができますので、上記の処理を再現できるようにします。処理自体はそこまで難しくはありません。これまでにファイルの読み書き機能、Moneyクラスの足し・引き処理を作成しているのでこれらを組み合わせるだけになります。

public Money AddBalance(Money add)
{
    var balance = _repos.Read();
    var newBalance = balance.Add(add);
    _repos.Write(newBalance);
    return newBalance;
}

という訳でコーディングは上記のようになります。GetBalanceメソッドで残高を取得して、現在の残高に入金金額を足し合わせます。MoneyクラスのAddメソッドでは新しいオブジェクトで返却されるように実装しているので、ここで新規オブジェクトを作成する必要はありません。

最後にAddメソッドで返却されてきた内容を呼び出し元に返却するだけでOKになります。現在の実装としては十分でしょう。ここまで実装が出来たらテストを実行してレッドからグリーンになるかを確認します。グリーンになれば完了です。それでは次回は残高引出の処理を実装していきます。