11
ファイルシステムに依存するコードの単体テスト
私は、ZIPファイルを指定した場合に必要なコンポーネントを作成しています。 ファイルを解凍します。 解凍したファイルから特定のdllを見つけます。 リフレクションを介してそのdllをロードし、その上でメソッドを呼び出します。 このコンポーネントを単体テストしたいのですが。 ファイルシステムを直接処理するコードを作成したくなります。 void DoIt() { Zip.Unzip(theZipFile, "C:\\foo\\Unzipped"); System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar"); myDll.InvokeSomeSpecialMethod(); } しかし、「ファイルシステム、データベース、ネットワークなどに依存する単体テストを記述しないでください」とよく言われます。 これをユニットテストに適した方法で書くとすると、次のようになると思います。 void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner) { string path = zipper.Unzip(theZipFile); IFakeFile file = fileSystem.Open(path); runner.Run(file); } わーい!今ではテスト可能です。DoItメソッドにテストダブル(モック)をフィードできます。しかし、どのようなコストで?これをテスト可能にするためだけに、3つの新しいインターフェースを定義する必要がありました。そして、正確には何をテストしていますか?私のDoIt関数がその依存関係と適切に相互作用することをテストしています。zipファイルが適切に解凍されたことなどはテストしません。 もう機能をテストしているような気がしません。クラスの相互作用をテストしているような感じです。 私の質問はこれです:ファイルシステムに依存する何かを単体テストする適切な方法は何ですか? 編集私は.NETを使用していますが、この概念はJavaまたはネイティブコードにも適用できます。