File.Copy、File.Delete、File.Existsなどを呼び出すメソッドがいくつかあります。実際にファイルシステムにアクセスせずにこれらのメソッドをテストするにはどうすればよいですか?
私は自分自身をn00bのユニットテストだと思っているので、アドバイスをいただければ幸いです。
File.Copy、File.Delete、File.Existsなどを呼び出すメソッドがいくつかあります。実際にファイルシステムにアクセスせずにこれらのメソッドをテストするにはどうすればよいですか?
私は自分自身をn00bのユニットテストだと思っているので、アドバイスをいただければ幸いです。
public interface IFile {
void Copy(string source, string dest);
void Delete(string fn);
bool Exists(string fn);
}
public class FileImpl : IFile {
public virtual void Copy(string source, string dest) { File.Copy(source, dest); }
public virtual void Delete(string fn) { File.Delete(fn); }
public virtual bool Exists(string fn) { return File.Exists(fn); }
}
[Test]
public void TestMySystemCalls() {
var filesystem = new Moq.Mock<IFile>();
var obj = new ClassUnderTest(filesystem);
filesystem.Expect(fs => fs.Exists("MyFile.txt")).Return(true);
obj.CheckIfFileExists(); // doesn't hit the underlying filesystem!!!
}
あなたが絶対にこれをしなければならないなら、TypemockIsolatorはあなたの友達です。
自分で使ったとは言えず、代わりに自分のやり方でデザインしようと思いますが、私が知る限り、それでうまくいきます。
これにはMoqを使用します。Moqにプロキシのインスタンス(モックインスタンス)を作成させるには、本物にプロキシするインターフェイスとクラスを作成する必要がありますが、これらの種類のものをテストするための最良の方法です。
これにはモック フレームワークを使用できます。これにより、File オブジェクトの偽のコピーが作成され、テスト対象のシステムにファイルを挿入できます。
Rhino Mock をお勧めします。
私はほとんどのプロジェクトで、すべてのファイル操作を行う IFileController というインターフェイスを作成する傾向があります。これには、基本的なメソッドに加えて、ファイルを処理する .NET フレームワークが提供しないメソッドを含めることができます。
依存性注入フレームワークを使用すると、型が何であるかを正確に知らなくても IFileController のインスタンスを取得でき、フレームワーク型のモックをいじる必要なく使用できます。これにより、すべてがよりテストしやすくなり、おまけとして、コードをまったく変更せずにファイル ストレージ メカニズムを変更できます。
マイナス面としては、新しい開発者にはこのインターフェイスについて説明する必要があります。そうしないと、.NET メソッドを直接使用することになります。
私はCodePlex でJolt.NETプロジェクトを管理しています。このプロジェクトには、このようなインターフェイスとその実装を生成するためのライブラリが含まれています。詳細については、 Jolt.Testingライブラリを参照してください。