2011-01-12 41 views
0

嘲諷私有字段我有以下的類定義,由此attribute字段經由反射由NHibernate的水合。現場沒有公開爲對象,而是我想隱藏它的實現,只是提供參考attribute領域的性能特性。與RhinoMocks

public class CustomerAttribute : ICustomerAttribute 
{ 
    private IAttribute attribute; 

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

    } 

}

我試圖嘲弄與RhinoMocks這個對象,但我不知道如何來滋潤attribute現場進行測試。我試圖通過反射手動設置attribute場,但我從RhinoMocks(這是有道理的)的代理錯誤。

那麼,如何滋潤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中。這應該通過構造函數(通常是首選)或屬性注入完成。如果您不熟悉它,請查看「控制反轉」。

此外,ICustomerAttribute不應該被創建爲一個模擬 - 具體類型應該被顯式地創建(即,「新CustomerAttribute」)。畢竟,CustomerAttribute(實現!)是你試圖測試的東西。

0

我不確定你要在這裏測試什麼。如果你想測試你的CustomerAttribute類比你需要創建它的一個實例(而不是模擬ICustomerAttribute)。

爲了設置你的CustomerAttribute屬性,你既可以

  • 使用dependency injection注入正確的屬性和測試
  • 真正CustomerAttribute實例的使用反射過程中使用它,你測試
  • 創建