内部で使っているクラスを無理やりモックと差し替え可能にする方法

素人が購入することは考えにくい Visual Studio 2010*1で、クラス内部で使っている他のクラスを無理やりモックに差し替え可能にする C# サンプルコードを書いてみた。

public class Foo
{
    public Foo()
    {
        // デフォルトを設定
        CreateBar = () =>
        {
            return new BarProxy(new Bar());
        };
    }

    // 生成するインスタンスを差し替え可能にする
    internal Func<IBarProxy> CreateBar { get;set; }

    // 使うメソッドだけを抽出したインタフェースを定義
    internal interface IBarProxy
    {
        DataTable FetchHugeData();
    }

    // オリジナルに移譲するだけのプロキシクラスを実装
    private class BarProxy : IBarProxy
    {
        // モックと差し替えたかったクラス
        private readonly Bar _bar;

        public BarProxy(Bar bar)
        {
            _bar = bar;
        }

        public DataTable FetchHugeData()
        {
            return _bar.FetchHugeData();
        }
    }

    // インタフェースを使って処理を記述
    public int GetHugeDataCount()
    {
        var bar = CreateBar();
        return bar.FetchHugeData().Rows.Count;
    }
}

プロキシクラス用のインタフェースは internal なんで他のアセンブリからは見えないし、InternalVisibleTo でテストプロジェクトにだけ公開すれば、単体テストは書ける。

どんなクラスにも使えるけど、利用するクラスの数だけ、インタフェースとプロキシクラスとプロパティが必要なので、仕事では使い物にならない。思いついたから書いてみただけの、完全なお遊びコード。

プロは Visual Studio Ultimate 2012 を購入して、Fakes Framework を使うんだろうな。

*1:http://www.jiji.com/jc/zc?k=201210/2012101800773