This was created during my time as a Code Chrysalis Student
自動販売機の仕組みを作成することで、ペアプログラミングとテスト駆動開発を練習しましょう。
このタスクでは次のことを行います:
- テスト駆動開発を使って、ステートマシンを作成する。
- コードを書く前にテストを書く練習をする。
- SEAT パターンを使ってテストを書く練習をする。
- 効果的なペアプログラミングの手法を練習する。
- 買い物客として、
- 自動販売機が欲しい。
- 結果として、商品を効率的に購入できるようになる。
- balance - コインを入れてまだ使用していない金額(残高)
- till - 自動販売機内のコインと数のマップ
- selectedRow - 選択した行があれば、その行を保存
- selectedColumn - 選択された列があれば、その列を保存
以下は、実装すべきメソッドの提案にすぎないことを注意してください。おそらく、これらのメソッド以外にも、別のメソッドを追加した方がテストが容易になるでしょう。要確認:単一責任の原則、メソッドに 1 つのことだけを行わせるべきです。
insertCoin(denomination)
- 自動販売機にコインを入れます。changeReturn()
- コンソールにコインのログを記録し、残高をリセットします。pressButton('A'-'D')
- 行を選択します。pressButton(1-4)
- 列を選択します。
名前と価格を持ったお気に入りの製品からなる 4x4 の二次元配列として、自動販売機をモデル化します。例:
const juice = {name: `Apple Juice`, price: 350, count: 5};
const coffee = {name: "Tully's", price: 250, count: 7};
const inventory = [
[juice, coffee, ..., ...],
[..., ..., ..., ...],
[..., ..., ..., ...],
[..., ..., ..., ...],
]
ハッピーパス(デフォルトのシナリオ)は次のように進行する必要があります:
- コインを挿入
- 行を選択
- 列を選択
- 製品を出す(コンソールにログを記録する)
- 在庫の更新
- お釣りを出す
- 残高がゼロの 場合、コインが挿入された 時に、その後 残高が加算され、かつ コインの種類を保存する必要があります。
- 行が選択されていない 場合、行が選択された 時に、行の文字を保存して、コンソールにログを表示する必要があります。
- ある行を選択した 場合、十分な残高と在庫がある 時に、列が選択されます。
- その後 行と列をコンソールにログを出力する必要があります。
- "Here is your [item name]" というメッセージをログ出力する必要があります。
- そして、アイテム(商品)の在庫を 1 つ減らす必要があります。
- また、正しいお釣りを返します(お釣りのコインの種類と数を、コンソールにログ出力)
- 行と列が選択されている 場合、対象の列に在庫がない 時に、エラーメッセージをログに出力する必要があります。
- 行と列が選択されている 場合、選択されたアイテム(商品)を購入するための残高が不足している 時に、その後 エラーメッセージをログ出力する必要があります。
- プログラムを起動した 場合、残高が読み込まれた 時に、その後 残高を 0 とする必要があります。
注意してください:残高を計算してお釣りを返すには、コインの種類と数の両方を記憶しなければいけません
少なくとも、すべての必要要件に対してテストを実装しなければいけませんが、これらのテストのみに限定すべきではありません。必要なだけテストを記述しましょう。
優れた TDD 開発者として、仕様外のエッジケースを見つけた場合は、PM(インストラクター)に期待される機能を尋ねる必要があります。
この機会に、ピンポンペアプログラミングを練習しましょう:
- 左側のペアは、失敗するケースのテストを書きます。
- 右側のペアは、テストをパスするための最小限のコードを書きます。
- 右側のペアは、次のテストを書きます。
- 左側のペアは、テストをパスするコードを書きます。
リファクタリングすることを忘れないでください。そしてグリーンになった時(テストをパスした時)だけ、リファクタリングを行ってください!
ヒント:コンソールにログ出力されたものをテストしようとせず、代わりにメソッドをどのように組み立てて、お釣りや出したアイテム(商品)などのオブジェクトを、戻り値として返すか、その方法を考えましょう。これにより、戻り値に対して、テストを作成できるようになります。
yarn
yarn test