私は現在、ファイルシステムのコンテンツに基づいて(とりわけ)テーブルを生成するプロジェクトに取り組んでおり、その結果、見つかったものに対してメタデータの変更を行います。問題は、これについてテストをどのように作成するか、設定するかです。これを模倣する簡単な方法はありますか?または、「サンドボックス」をセットアップする必要がありますか?
TDDでは常に外部リソースを使用するので、ファイルシステム操作への1つ以上のインターフェースを作成し、それらを「モックアウト」します。ファイルシステムの操作自体ではなく、「テーブルジェネレータ」とメタデータ変更コードをテストする必要があります(ほとんどの場合、ファイルシステムにアクセスするために既成のライブラリ実装を使用しています)。
「テスト」ファイルシステムの何が問題になっていますか?
操作をテストするのに十分なコンテンツを持つテンプレートフォルダー/ディレクトリ構造を作成します。
ユニットテストのセットアップ中に、この初期構造をコピーします(テンプレートを圧縮してテスト領域に解凍することをお勧めします)。テストを実行します。分解中にすべてを削除します。
モッキングの問題は、最初に、プロジェクトに属するファイルシステム、OS、データベースが実際には外部リソースとして適格ではないことと、2番目に低レベルのシステムコールをモックすることは、時間がかかり、エラーが発生しやすいことです。
これは、統合テストに間違いなく必要な類のことです。現実のファイルシステムには、あらゆる種類の奇妙な動作があります(たとえば、Windowsで、削除機能を含むプロセスが開いているファイルを削除できないようにする)。
したがって、TDDアプローチは最初に統合テストを記述です(厳密に言うと、TDDには「単体テスト」と「統合テスト」という明確な概念はありません。これらは単なるテストです)。おそらくそれで十分でしょう。そう仕事完了、停止、帰宅。
そうでない場合は、ファイルを整理して適切にテストするのが容易ではない内部の複雑さがいくつかあります。その場合は、単純にその複雑さを取り除いてクラスに入れ、そのクラスの単体テストを記述にします。その一般的なクラスは、データベース、xmlファイルなどの場合にも使用できることに気付くでしょう。
どのような場合でも、テスト中のユニットが間違っているかどうかに合格するテストを作成するために、作成しているコードの基本的なコアを取り、それを「模倣」することはありません。
あなたの質問は「ファイルシステムの操作に依存するクラスをテストするための良い/受け入れられた方法」として理解しています。あなたはあなたのOSのファイルシステムをテストしたいと思いません。
@Doc Brownの回答が可能な限り小さく示唆しているように、「ファイルシステム操作へのインターフェースと「モックアウト」」への努力を維持するために、Javaバイナリストリームまたはテキストリーダー(またはc#または同等のプログラミング言語で同等のもの) using)tddで開発されたクラスでファイル名を含むファイルを直接使用する代わりに.
例:
Javaを使用して、クラスCsvReaderを実装しました
public class CsvReader {
private Reader reader;
public CsvReader(Reader reader) {
this.reader = reader;
}
}
テストのために私はこのようなメモリデータで使用しました
String contentOfCsv = "TestColumn1;TestColumn2\n"+
"value1;value2\n";
CsvReader sut = new CsvReader(Java.io.StringReader(contentOfCsv));
またはテストデータをリソースに埋め込む
CsvReader sut = new CsvReader(getClass().getResourceAsStream("/data.csv"));
本番環境ではファイルシステムを使用します
CsvReader sut = new CsvReader(new BufferedReader( new FileReader( "/import/Prices.csv" ) ));
このように、私のCsvReaderはファイルシステムに依存せず、ファイルシステムの実装がある抽象化「リーダー」に依存します。
ファイルシステム操作のラッパーを作成します。テストでは、ラッパーと同じインターフェイスを実装するモックを渡します。本番環境では、ラッパーを渡します。