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によると、「ジェネリック メソッドを呼び出すときに使用する型引数の配列です。」って書いてあるんだけどね。