2011-01-12 8 views
0

私は、attributeフィールドがNHibernateによるリフレクションを介して水和される以下のクラス定義を持っています。フィールドはオブジェクトとして公開されていませんが、その実装を非表示にして、attributeフィールドのプロパティを参照するプロパティを提供するだけです。プライベートフィールドをRhinoMockでモックする

public class CustomerAttribute : ICustomerAttribute 
{ 
    private IAttribute attribute; 

    public string DisplayName 
    { 
     get { return attribute.DisplayName;} 

    } 

}

私はRhinoMocksでこのオブジェクトを模擬しようとしているが、私はテストのためattributeフィールドを水和するかどうかはわかりません。私はattributeフィールドをリフレクションで手動で設定しようとしましたが、RhinoMockからプロキシエラーが発生します(意味があります)。

したがって、attributeフィールドを水分調整してCustomerAttributeオブジェクトのプロパティをテストできますか?ここで

が今の私のテストです...

 [Test] 
    public void PropertiesTest() 
    { 
     MockRepository mock = new MockRepository(); 
     ICustomerAttribute attribute = mock.StrictMock<ICustomerAttribute>(); 

     //Set the attribute field 
     FieldInfo fieldInfo = typeof(CustomerAttribute).GetField("attribute", 
                 BindingFlags.Instance | BindingFlags.SetField | 
                 BindingFlags.NonPublic); 

     fieldInfo.SetValue(attribute, new Domain.Attribute()); //This does not work 

     Expect.Call(attribute.DisplayName).Return("Postal Code"); 
     mock.ReplayAll(); 

     Assert.AreEqual(true, attribute.DisplayName); 
     mock.VerifyAll(); 

    } 

答えて

0

CustomerAttributeはテスト(SUT)の下で、あなたの対象であり、IAttributeは、テストのために嘲笑される必要があり、依存関係であれば、IAttribute以上の可能性があることが必要CustomerAttributeに注射可能です。これは、コンストラクタ(通常は優先される)またはプロパティの注入のどちらかを使って行う必要があります。あなたがすでにそれに慣れていない場合は、 "Inversion of Control"を見てください。

また、ICustomerAttributeをモックとして作成しないでください。具体的なタイプは明示的に作成する必要があります(つまり、「new CustomerAttribute」)。結局のところ、CustomerAttribute(implentation!)はあなたがテストしようとしているものです。

0

ここで何をテストしようとしているのか分かりません。 CustomerAttributeクラスをテストする場合は、ICustomerAttributeをマックする代わりに、そのインスタンスを作成する必要があります。あなたはどちらか

  • 使用dependency injectionが正しい属性を注入し、実際のCustomerAttributeインスタンスの
  • 使用反射をテスト中にそれを使用することができ、あなたのCustomerAttributeの属性を設定するために

    あなたは

  • をテストするために作成しました
関連する問題