3

私はTDDにかなり慣れておらず、ユニットテストに慣れていないため、質問です。PHPで書かれたこのレガシー関数があります

function foo(){
   x = bar();
   y = baz();
   if (x > y)
     return 'greater';
   return 'lesser';
}

x (bar() によって返される値) が常に y (baz() によって返される値) より大きい場合、「小さい」return ステートメントをテストすることはできません。

両方のテスト ケースをカバーし、100% のコード カバレッジを達成するにはどうすればよいですか? 依存性注入フックのために foo() を foo(x, y) として再定義することは、レガシー コードではオプションではありません。

4

2 に答える 2

0

bar() と baz() は入力パラメータを取らないので、定数を返しているか (そして foo() を { return 'greater' } にすぐにリファクタリングできます)、またはいくつかの外部変数に依存しています。場合は、次のようにします

 function testFooReturnsGreater() {
     setEnvironmentSoBarIsGreaterThanBaz()
     assert ("greater".equals(foo())
 }

 function testFooReturnsLesser() {
    setEnvironmentSoBarIsLesserThanBaz()
    assert("lesser".equals(foo())
}

クリスマスでない限り bar() > baz() と言うので、 setEnvironmentxxx() フィクスチャはプログラムの現在の日付の概念を変更する必要があります (うまくいけば、実際のシステムクロックではなく、モックできるもの)。

于 2013-08-21T14:55:48.843 に答える