2

私は何よりも TDD の演習として単純なプロジェクトに取り組んでいます。このプログラムは、Web サーバーからいくつかの画像を取得し、それらをファイルとして保存します。記録のために、私がやっていること (私の望む最終結果) は、この perl スクリプトに非常に似ていますが、C# です。

ファイルをディスクに保存する必要があるところまで来ました。コードを強制するために単体テストを作成する必要があります。これにアプローチする方法がわかりません。コードが予想されるファイル名で予想されるファイルを作成したことを確認できるようにしたいのですが、もちろんファイルシステムにはまったく触れたくありません。私は単体テストとTDDにまったく慣れていませんが、何らかの理由で、この状況で何をすべきかが本当にわかりません。一度見れば答えは明らかだと思いますが....コードが発生する脳内の不思議な場所は、単に協力的ではありません。

私が選んだツールは MSpec と FakeItEasy ですが、あらゆるフレームワークでの提案を歓迎します。ファイルシステムの相互作用をユニットテストするための賢明なアプローチは何ですか?

4

1 に答える 1

5

ここで役立つのは依存性注入です。モノリシックなダウンロード操作を小さな断片に分割し、ダウンローダに挿入します。これらの部分のインターフェイスを宣言します。

public interface IImageFetcher
{
    IEnumerable<Image> FetchImages(string address);
}

public interface IImagePersistor
{
    void StoreImage(Image image, string path);
}

これらの宣言を使用すると、次のようにすべてを統合するダウンローダー クラスを作成できます。

public class ImageDownloader
{
    private IImageFetcher _imageFetcher;
    private IImagePersistor _imagePersistor;

    // Constructor injection of components
    public ImageDownloader(IImageFetcher imageFetcher, IImagePersistor imagePersistor)
    {
        _imageFetcher = imageFetcher;
        _imagePersistor = imagePersistor;
    }

    public void Download(string source, string destination)
    {
        var images = _imageFetcher.FetchImages(source);
        int i = 1;
        foreach (Image img in images) {
            string path = Path.Combine(destination, "Image" + i.ToString("000"));
            _imagePersistor.StoreImage(img, path);
            i++;
        }
    }
}

ImageDownloaderは、どの実装が使用され、どのように機能するかを知らないことに注意してください。

List<string>これで、ファイル システムに格納される実際のファイル名を提供する代わりに、たとえばファイル名をファイル名に格納するダミーの永続化プログラムをテスト時に提供できるようになりました。


アップデート

// For testing purposes only.
class DummyImagePersistor
{
    public readonly List<string> Filenames = new List<string>();

    public void StoreImage(Image image, string path)
    {
        Filenames.Add(path);
    }
}

テスト:

var persistor = new DummyImagePersistor();
var sut = new ImageDownloader(new ImageFetcher(), persistor);
sut.Download("http://myimages.com/images", "C:\Destination");
Assert.AreEqual(10, persistor.Filenames.Count);
...
于 2013-07-05T16:33:24.157 に答える