0

最近、自分のプロジェクトで TDD の方法論を採用しようとしていますが、特定のコードをテストする方法を知るのに苦労しています。私はこのテーマについてかなり読んだことがありますが、それを実践するのに苦労しています。そういうわけで、私の方法を投稿して、それをどのようにテストしようとするかを尋ねます。

public function simulate(){
    while (!isComplete()) {
        if ($this->currentOuts == 3) {
            advanceInning();
        } else {
            $batter = getBatter();
            $pitcher = getPitcher();
            $atBat = new AtBat($batter, $pitcher);
            $result = $atBat->simulate();
            handleAtBatResult();
        }
    }
}

シミュレート内のすべての関数呼び出しが適切にテストされていると仮定します。他にテストすることは本当にありますか?たぶん、特定の関数が呼び出されていますか?明白なテストの欠如は (少なくとも私にとっては) 設計上の問題を示していますか?

4

2 に答える 2

1

関数のテストが難しい場合、それはコードの匂いです。テストを困難にしている理由と、それを簡単にするために変更できる可能性があります。

あなたの場合、あなたの機能はあまりにも多くのことをしているように思えます。シミュレーションが完了したかどうかを確認し、バッターとピッチャーを取得して、打席をシミュレートしています。関数が何をするかを説明するときに「AND」という単語を使用する場合は、機能を分割してください。

また、依存性注入の欠如にも苦しんでいるため、モック オブジェクト ($batterおよびpitcher) を渡すことができません。

newまた、関数での使用を避けたい(ファクトリの一部である場合を除く) そのオブジェクトを置き換えることはできず、クラスが持つ機能に依存しています。そのオブジェクトの動作を制御できなくなります。

アップデート

advanceInningRE:とisCompleteへの移動についてのコメントsomeObjectです。行動の観点から物事を考えてください。という理由だけで関数をオブジェクトに入れないでください。パブリックメソッドとしてandを持つGameオブジェクトがあります。どのオブジェクトを作成するかは、抽象化と何を達成しようとしているかによって異なります。 オブジェクトは、1 つのことを表し、責任を負う必要があります。isCompleteplayNextInning ゲームを表すゲームがあります。各ゲームにはイニングがあるため、おそらくイニング オブジェクトがあります。2 つのチームがあるため、チーム オブジェクトがある可能性があります。ゲーム コンストラクターに渡すイニングを作成するイニング ファクトリが必要な場合があります (その後、テストを行うときにそれをモックできます)。最終的に得られるロジックによっては、ハーフイニングをオブジェクトに抽象化することさえできます。それはすべて、達成しようとしている行動によって決まります。

あなたは良いことである本当に小さなオブジェクトのトンで終わることがわかります. あなたのデザインは柔軟で拡張性が高くなります。

于 2013-06-14T13:59:02.803 に答える