Visual Studio 2008 Professional 自動テストを使用しています。ファイルに書き込む関数があります。ファイル書き込み機能の単体テストをしたい。何らかの方法でファイルをモックする必要があることをどこかで読んだことがあります。やり方がわかりません。手伝ってくれますか?
インターネットからページをダウンロードするメソッドを単体テストする方法は?
4 に答える
メソッドがファイル ストリーム自体を開く必要がある場合、それをモックするのは困難です。ただし、ストリームをメソッドに渡してそれに書き込むことができる場合は、代わりに MemoryStream を渡すことができます。別のオーバーロードでは、より少ないパラメーターを取り、ファイルを開き、FileStream を他のメソッドに渡すことができます。
この方法では、(実際にディスクにヒットするテストを 1 つまたは 2 つ作成しない限り) 完全なカバレッジは得られませんが、ほとんどのロジックは完全にテストされたコードであり、Stream パラメーターを受け取るメソッド内にあります。
それは、コードがナットとボルトにどれだけ近いかによって異なります。たとえば、Stream
代わりに s で作業しMemoryStream
、コードに a を渡す (そして内容をチェックする) ことができます。ファイルシステム(一時領域内)に書き込み、内容を確認してから捨てることができます。コードがファイル システムの少し上にある場合は、IFileSystem
必要な高レベル メソッド ( WriteAllBytes
/などWriteAllText
) を使用してモック可能なインターフェイスを作成できます。ただし、ストリーミング API をモックするのは面倒です。
インターネットからダウンロードする (またはふりをする) 場合は、(たとえば)IWebClient
必要な関数 (DownloadString
など) を備えたインターフェイスを作成できます。それをモックして固定コンテンツを返しWebClient
、実際の実装の基礎としてのようなものを使用します。もちろん、実際のサイトに対して実際の実装をテストする必要があります。
テストの目的がファイルが実際に作成されたことをテストすることである場合、それは単体テストではなく統合テストです。
適切な内容がファイルに書き込まれていることをテストすることが目的の場合は、ファイル アクセスをインターフェイスの背後に隠し、インメモリ実装を提供します。
同じことが Web ページへのアクセスにも当てはまります。
interface IFileService
{
Stream CreateFile(string filename);
}
class InMemoryFileService : IFileService
{
private Dictionary<string, MemoryStream> files = new Dictionary<string, MemoryStream>();
public Stream CreateFile(string filename)
{
MemoryStream stream = new MemoryStream();
files.Add(filename, stream);
return stream;
}
public MemoryStream GetFile(string filename)
{
return files[filename];
}
}
GetFile を使用すると、ディスクに書き込む必要があるものを見つけることができます。
実際には、ファイルを関数に直接書き込む呼び出しを行いたくはありませんが、代わりにインターフェイスを使用してクラス内でファイル I/O をラップします。
その後、Rhino Mocks などを使用して、インターフェイスを実装するモック クラスを作成できます。