単体テストを書く習慣を身に付けようとしています。以前にいくつか書いたことがありますが、通常は非常に基本的なものでした...品質を向上させたいので、TDD への移行を開始したいと思います。私のコード(設計と構造)の - カップリングを減らすと同時に、テスト可能なビルドにすり抜ける回帰の数を減らすことができれば幸いです。
私は最初に取り組んでいる比較的単純なプロジェクトを取りました。結果として得られるプログラムは、フォルダーを監視し、このフォルダー内のファイルに作用します。
プロジェクトから抽出されたコードの典型的な例を次に示します。
private string RestoreExtension(String file)
{
var unknownFile = Path.GetFileName(file);
var ignoreDir = Path.GetDirectoryName(file) + "\\Unknown";
string newFile;
//We need this library for determining mime
if (CheckLibrary("urlmon.dll"))
{
AddLogLine("Attempting to restore file extension");
var mime = GetMimeType(BufferFile(file, 256));
var extension = FileExtensions.FindExtension(mime);
if (!String.IsNullOrEmpty(extension))
{
AddLogLine("Found extension: " + extension);
newFile = file + "." + extension;
File.Move(file, newFile);
return newFile;
}
}
else
{
AddLogLine("Unable to load urlmon.dll");
}
AddLogLine("Unable to restore file extension");
if (!Directory.Exists(ignoreDir))
{
Directory.CreateDirectory(ignoreDir);
}
var time = DateTime.Now;
const string format = "dd-MM-yyyy HH-mm-ss";
newFile = ignoreDir + "\\" + unknownFile + "-" + time.ToString(format);
File.Move(file, newFile);
return String.Empty;
}
質問:
IO を使用してメソッドをテストするにはどうすればよいですか? これは遅いので(そして統合テストのほうが多いのでしょうか)、実際のファイルを使用したくありませんが、別の方法が本当にわかりません。切り替え可能な IO 抽象化レイヤーを追加することもできますが、コードが不必要に複雑になる可能性があるように思えます...
このようなプロジェクトは単体テストの価値がありますか? というか、単純すぎるかな。.Net とサード パーティのライブラリ呼び出しを削除すると、ほとんど残っていません。テスト可能にするための作業量が、テストするのに適していないことを意味する場合はありますか?
このプロジェクトはたまたま Windows サービスであるため、このプロジェクトの多くのメソッドは非公開です。外部から見える (パブリックまたはインターフェイスを介して公開される) メソッドのみを実際にテストする必要があることを読みましたが、この場合、独自のメソッドを公開することはほとんどありません。このプロジェクトはテストする価値がありますか (id はおそらくメソッド アクセス修飾子を public に変更するか、いくつかの属性を追加して NUnit がそれらを認識できるようにする必要があるため)?