漫坊亭

社会の底辺プログラマ

MSTest で、拡張メソッド(generic)のテスト (未完)

いままでNUnit派だったのだが、大人の事情でMSTestを使うことになった。

ネットサーフィンしながら勉強していると、 (Chaining Assertion)http://chainingassertion.codeplex.comというのを見つけた。
これはいいね!

ひととおり書いて、テストコードのリファクタリング?をしていると、プライベートメソッドのテストで使っている、リフレクションの部分が気に食わない。

VisualStudioの上位のバージョンだと、いろいろできるのは知っていたので、なにかよいユーティリティクラスはないかと探していると、、、 Microsoft.VisualStudio.TestTools.UnitTesting に、PrivateTypeというクラスを見つけた。

    public static class Foo
    {
        private static void Foo1() { }
        private static void Foo2(int bar) { }
        private static int Foo3() { return 12; }
        private static int Foo4(int bar) { return bar*2; }

テスト対象のダミーと、テストコードの呼び出し(テストはしていない)

        var pt = new PrivateType(typeof(Foo));

        pt.InvokeStatic("Foo1");

        pt.InvokeStatic("Foo2", new Type[] { typeof(int) }, new object [] { 1 });

        var foo3 = pt.InvokeStatic("Foo3");

        var foo4 = pt.InvokeStatic("Foo4", new Type[] { typeof(int) }, new object[] { 12 });

ここまでは簡単だった。
ちなみに、スタティックでないときは、PrivateObjectを使う。

そして、問題のジェネリックな奴。

    private static int Foo5<T>(T target)
    {
        return 13;
    }

どうしても、コイツを呼び出す方法がわからない。

        var foo5 = pt.InvokeStatic("Foo5",
            new Type[] { typeof(int) }, 
            new object[] { 1 },
            new Type[] { typeof(int) });

こうかな?と思ったのだが、そんな奴はいないと怒られる。
4つめの引数が、Tの型を指定するっぽいのだけど。
MSDNによると、「ジェネリック メソッドを呼び出すときに使用する型引数の配列です。」って書いてあるんだけどね。