私は単体テストに不慣れで、現在、ブランチを含むメソッドをテストする適切な方法を見つけるのに問題があります。
問題を説明するために使用できる小さなデモ メソッドを作成しました。
public void ExportAccounts()
{
int emptyAccounts = 0;
int nonEmptyAccounts = 0;
int errorous = 0;
string outputPath = this.GetOutputPath();
Account[] accounts = this.MyWebserviceAdapter.GetAccounts();
foreach(Account account in accounts)
{
try
{
if(account.Amount > 0)
{
this.ExportNonEmpty(outputPath, account);
nonEmptyAccounts++;
} else {
this.ExportEmptyAccount(outputPath, account);
emptyAccounts++;
}
} catch(Exception e) {
logger.error(e);
errorous++;
}
}
logger.debug(string.Format("{0} empty / {1} non empty / {2} errorous", emptyAccounts, nonEmptyAccounts, errorous));
}
MyWebserviceAdapter をモックして、事前定義されたアカウントのリストを返すことができます。空であるアカウントと空ではないアカウントのリストを同じテストに入力する必要がありますか、それとも別のテストを行う必要がありますか?
また、私の ExportNonEmpty() および ExportEmpty() メソッドはプライベートですが、ファイル システムにファイルを書き込みます。ファイルシステムに触れないように、モック FileProvider を提供する必要がありますか?
ExportNonEmpty() と ExportEmpty() を公開して、それらを個別にテストできるようにする必要がありますか? これらのメソッドには、いくつかの if-then-else ステートメントも含まれており、例外などをスローできます。
あるテストから別のテストにコードをコピーしているすべてのコードパスのテストを作成するかどうかがわかります-モックの生成など..それは少し奇妙ではありませんか?
メソッドを呼び出した後にカウンター変数を検証できるようにするには、カウンター変数を out 変数として公開する必要がありますか?
this.GetOUTputPath() は、静的な ConfigurationManager を介して構成ファイルから値をフェッチします。a) testt の下のクラスの部分的なモックを作成して GetOutputPath メソッドを上書きするか、b) モックアウトできる独自の ConfigurationAdapter を作成して、これをモックアウトする必要がありますか?
nunit と Rhino Mocks を使用しています。