2017-03-10 7 views
1

皆さん。私は単体テストをやっていますが、私は自分で解決できない問題があります。 問題を以下に示します:C#:プライベート内部クラスのリストをインスタンス化するにはどうすればよいですか?

public class A { 
    private class B{ } 
    private List<B> list = new List<B>; 
} 

私はlist[i]nullであるかどうかをテストしたいですか?今、Reflectionを使用してリストを取得できますが、質問にはBのインスタンスをリストに追加するにはどうすればよいですか? ご協力いただきありがとうございます!

+0

それは、C#コンパイラをテストするためにあなたの仕事ではありません。このリストは、実行時にアクセス可能なスコープ内では決して「null」にはなりません。実際の問題の代表例を示してください。 – CodeCaster

答えて

2

一般に、このコードをテストするだけでは生産性が向上しません。 私は他の答えには反対しますが、私は秘密のテストをしていないので、テストはその行動に意味があるはずです。

確かに、各メンバーの単体テストを書いて、主要なPIBをリファクタリングすることができます。これは生産的だろうか?あんまり。何が価値があるために、あなたはもう少し反射魔法と出来上がりを

しかし、必要があります。

[TestMethod] 
    public void PrivateListCanHaveObjectsAdded() 
    { 
     var target = new A(); 

     var b = typeof(A).GetNestedType("B", BindingFlags.NonPublic); 
     var list = typeof(A).GetField("list", BindingFlags.Instance | BindingFlags.NonPublic); 

     var bInstance = Activator.CreateInstance(b); 
     var addMethod = typeof(List<>).MakeGenericType(b).GetMethod("Add"); 
     var countProperty = typeof(List<>).MakeGenericType(b).GetProperty("Count"); 
     addMethod.Invoke(list.GetValue(target), new object[] { bInstance }); 

     Assert.AreEqual(1, countProperty.GetValue(list.GetValue(target))); 
    } 
+0

それは動作します!あなたの共有をありがとう! – Ico826

+0

答えがうまくいく場合は、受け入れを検討してください。 – zaitsman

3

ユニットテストは...ユニットをテストすることを意味します。彼らはあなたのプログラムの内部動作をテストするつもりはありません。あなたのクラスのAPIに対応するpublicをテストしようとしています。

クラスのパブリックメソッドが機能する場合は、それらが依存するすべてのprivateメカニズムも認識されます。 privateのメカニズムが壊れると、パブリックメソッドの動作が停止します。

+0

'test whatever'と呼ぶこともできますし、' unit tests'と呼ぶこともできます。誰かがそれを知ることなく期待される振る舞い(公的であれ非公開であれ)を壊すような方法でコードファイルを修正しないようにするために、 '何があってもテストする '存在する。 – zaitsman

+1

あなたの答えをありがとう!しかし、パブリックメソッドがクラッシュした場合、そのクラッシュの理由は、プライベートな内部メカニズムであるだけではなく、このプライベートなものの後に実行される別のものかもしれません。つまり、私のテストでプライベートなものが正しいことを確認しなければなりません。私は他のものをテストすることができます....? – Ico826

関連する問題