2016-08-25 4 views
1

私のコードで小さな変更要求に対してTDDを適用しようとしています。これは、ユニットテストケースがまったくない既存のコードであるためです。私は以下のシナリオで助けが必要です。1つの大きなメソッドまたはルーチンの1つのセクションにユニットテストケースを適用するにはどうすればよいですか?

は、例(C#のコードサンプル)考えてみましょう:

private void main() 
{ 
//some existing code logic 
existinglogicA(); 
existinglogicB<some_inlinecode>; 
existinglogicC<some_inlinecode>; 

//Say, I am going to add new code logic here to follow the upward code workflow 
newlogicX(); 

existinglogicD<some_inlinecode>; 
existinglogicE(); 
} 

質問: 1.私はユニットテストそれに対するパブリックメソッドとして "newlogicXを()" 公開するべきでしょうか? 2.ルーチン "main()"全体の単体テストを追加するのに問題はありますか?

+0

上記の質問にお役立てください。 – DevCod

答えて

1

ここには2つのアプローチがあります。より幅広い議論のためには、マイケルフェザーの著書「効果的なレガシーコードの作業」を参照してください。

簡単にメソッドをpublicにすることができます。欠点は、クラスへのパブリックインターフェイスが拡大し、この特定のメソッドをそのインターフェイスに公開したくないことです。決定の要因は、一般的には、制作における唯一の使用がクラス内であっても、メソッドがクラスの責任として意味を持つかどうかです。そうした場合、パブリックにすることで何も失うことはなく、テスト容易性の点では得られます。

もしそうでなければ、新しいクラスにメソッドを抽出するのが最善の方法です。メソッドがAPIメンバとして意味をなさない場合です。次に、そのクラスが使用されているクラスを分離して、新しいクラスの機能をテストできます。ここでの利点は、新しいクラスのロジックをより簡単にテストできることと、古いクラスが何らかのモックやフェイクインジェクションを持つことができ、古いクラスのテストで動作を制御するための潜在的に有用なテストシームを提供できることです。

新しいクラスに抽出する際の欠点は、あなたが示唆するように、新しいクラスには古いクラスで何が起こるかにある種の時間依存性があることがわかります。つまり、メソッド間のタイトな結合古いクラスのクラスと新しいクラスのメソッドを呼び出します。しかし現実的には、設計上の欠陥が存在し、新しいクラス構造は単に欠陥を強調しているだけです。しかし、あなたが得たのは、新しいクラス構造がよりテスト可能であり、その結果、より良いデザインにリファクタリングするのがやや容易であるということです。はこの種の問題を呈します。

tl; dr - 一方的にまたは別の方法で、このクラスまたは別の方法でメソッドを公開する必要があります。

+0

洞察に感謝します。将来の変更のためにベースラインのルールとしてそれを維持します。 – DevCod

0

可能であれば、ちょうどnewlogicXメソッドのテストを書く方が良いでしょう。その場合、テストで何かを逃した場合、後でそれを処理する方が簡単です。

+0

ありがとうございます。私はそれをテストするために公開する方法を保つことを望んでいた。 – DevCod

0

それがあなたの構造体ならば、公開してください。そのコードの構造が公表されているかプライベートであれば、どのような違いがありますか?

関連する問題