プライベート静的ジェネリックメソッドはどのようにテストされますか?内部は私のテストプロジェクトに見えます。どのようにしてこれらのメソッドをテストできますか?C#でのプライベート静的ジェネリックメソッドのテスト
internal class Foo {
// Non-static. This works!
private T TestThisMethod1<T>(T value) {
Console.WriteLine("Called TestThisMethod1");
return value;
}
// Static. Can't get this to work!
private static T TestThisMethod2<T>(T value) {
Console.WriteLine("Called TestThisMethod2");
return value;
}
// Static. Can't get this to work!
private static void TestThisMethod3<T>(T value) {
Console.WriteLine("Called TestThisMethod3");
}
// Static. Can't get this to work!
private static void TestThisMethod4<T, T2>(T value, T2 value2) {
Console.WriteLine("Called TestThisMethod4");
}
}
最初の例が有効です。静的ではありません。それはhttps://msdn.microsoft.com/en-us/library/bb546207.aspxの例です。対象は何度も議論されてきたこと:書面で
[TestMethod]
public void PrivateStaticGenericMethodTest() {
int value = 40;
var foo = new Foo();
// This works. It's not static though.
PrivateObject privateObject = new PrivateObject(foo);
int result1 = (int)privateObject.Invoke("TestThisMethod1", new Type[] { typeof(int) }, new Object[] { value }, new Type[] { typeof(int) });
// Fails
int result2 = (int)privateObject.Invoke("TestThisMethod2", BindingFlags.Static | BindingFlags.NonPublic, new Type[] { typeof(int) }, new Object[] { value }, new Type[] { typeof(int) });
// Fails
PrivateType privateType = new PrivateType(typeof(Foo));
int result2_1 = (int)privateType.InvokeStatic("TestThisMethod2", new Type[] { typeof(int) }, new Object[] { value }, new Type[] { typeof(int) });
// Fails
int result2_2 = (int)privateType.InvokeStatic("TestThisMethod2", BindingFlags.Static | BindingFlags.NonPublic, new Type[] { typeof(int) }, new Object[] { value }, new Type[] { typeof(int) });
// Stopping here. I can't even get TestThisMethod2 to work...
}
私の目的は、質問やプライベートメソッドをテストすることのメリットを議論するのはとてもではありません。さらに、質問を書く際の私の目的は、「PrivateObjectまたはPrivateTypeを使用してこれを行うことが可能なはずです。だから、どうすればいいのですか?
プライベート静的メソッドのコンシューマーはありますか?いいえの場合は、なぜその動作をテストしますか? –
一般的にプライベートメソッドは、 –
と呼ばれるパブリックメソッドを使用してテストされます。本当に、私は通常、「パブリックメソッドのみをテストする」という規範に従います。今日は、私がそれを避けることができれば、何でも公開することはできません。このメソッドは非常に深いコードに埋め込まれています。このメソッドをPrivateObjectまたはPrivateTypeのいずれかと分離してテストすることができます。 – clarionprogrammer