2013-04-05 5 views
5

2つの内部プロパティを持つパブリッククラス(TargetContainerDto)があります。列挙型とその列挙型の値を含む型。ユニットの内部プロパティをテストするためのリフレクション

私はユニットのテストを試みていますが、問題があります。

internal enum TargetContainerType 
{ 
    Endpoint, 
    Group, 
    User, 
    UserGroup 
} 


internal TargetContainerType Type { get; set; } 

これは私の反射コードは

public void setType(TargetContainerDto t, int val) 
{ 
    BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; 
    PropertyInfo pi = t.GetType().GetProperty("Type", bf); 
    pi.SetValue(t, val, null); 
} 

public TargetContainerDto setTypeTo(TargetContainerDto t, int val) 
{ 
    setType(t, val); 
    return t; 
} 

TargetContainerDtoがタイプよりも多くの性質を持っている私のテストクラスであるが、彼らはので、それらが細かいテスト公開されています。 iconURLは、タイプに応じてTargetContainerDtoで定義された文字列です。ここに私のtestMethodです:

public void DefaultSubGroupIcon() 
{ 
    var o1 = new TargetContainerDto 
    { 
     Id = 1234, 
     DistinguishedName = "1.1.1.1", 
     SubGroup = "test", 
    }; 
    setType(o1, 3); 
    Assert.AreEqual(o1.IconUrl, "/App_Themes/Common/AppControl/Images/workstation1.png"); 
} 

私はtypevalueを設定する必要があるとき、私は試験方法でsetTypeToを呼び出すが、私はMethodAccessExceptionを取得しています。私はそれがenumにアクセスできないからだと思う。リフレクションによってenumにアクセスするにはどうすればよいですか?

おかげ

+3

ちょうど興味深いことですが、テスト中のオブジェクトの内部状態にアクセスし、アプリケーションを少し再設計するために、テストでリフレクションを使用することをやめたことがありますか? –

+0

あなたは例外を投稿できますか? Typeは前に設定された値を持っていますか、それともnullですか? – Akku

+0

ちょうどあなたのシナリオをテストしたところ、うまくいきました。例外の詳細だけでなく、** TargetContainerDto **クラスの定義についても詳細を教えてください。それの基本クラスは何ですか? –

答えて

1

で説明したいくつかの方法がある私は、しかし私は、あなたが内部の状態をテスト避けるために再設計しようとする必要があります他のコメントに同意しますあなたのコードを試してみて、それは私のためにうまく動作します(VS2012の.Net 4)。

テスト中の私のクラスライブラリは、次のようになります。

using System; 

namespace ClassLibrary 
{ 
    internal enum TargetContainerType 
    { 
     Endpoint, 
     Group, 
     User, 
     UserGroup 
    } 

    public class TargetContainerDto 
    { 
     internal TargetContainerType Type 
     { 
      get; 
      set; 
     } 

     public void Print() 
     { 
      Console.WriteLine(Type); 
     } 
    } 
} 

とテストプログラム(コンソールアプリ)は次のようになります。予想通り

using System; 
using System.Reflection; 
using ClassLibrary; 

namespace Demo 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var test = new TargetContainerDto(); 
      setType(test, 1); 
      test.Print(); 
     } 

     public static void setType(TargetContainerDto t, int val) 
     { 
      BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance; 
      PropertyInfo pi = t.GetType().GetProperty("Type", bf); 
      pi.SetValue(t, val, null); 
     } 
    } 
} 

これは、Groupを出力します。このコードと実際のコードとの違いを特定できれば、問題を見つけることができます。

+0

こんにちは、助けてくれてありがとう。私が見ることができる唯一の違いは、内部コンテナがTargetContainerDtoクラスの外部で宣言されていることです。また、私のテストアプリは単体テストですが、それでも同じように動作するはずです。 – user966890

+0

私はsetTypeToメソッドを取り除いたときに私のために働いていました。どうもありがとう。私は、あなたが反射ではなくオルタナティブ・ウィスに反応した唯一の人であると答えています。ありがとう – user966890

7

マークあなたのInternalsVisibleTo属性を持つアセンブリ、あなたのテストのdllにリフレクションを使用する必要はありません。

[assembly:InternalsVisibleTo("TestAssembly")] 

は詳細についてはhereを参照してください:アプリケーション内のAssemblyInfo.csファイルに次の行を追加しますDLL。

+4

これを行うと、コード分析が未使用の内部を検出できなくなることに注意してください。 –

6

あなたは間違った質問をします。よりよい質問は次のようになります。

クラスの内部状態をテストIをどのように停止するのですか?

しかし、あなたは全くこれが必要な場合は、この関連SO answer

関連する問題