2008-11-25 94 views
2

我在項目中使用自定義屬性,我想將它們集成到我的單元測試中。嘲諷屬性 - C#

現在我使用Rhino Mocks來創建我的mock,但是我沒有看到添加我的屬性(以及參數)給他們的方法。

我錯過了什麼,或者它不可能嗎?其他嘲諷框架?或者我必須使用我的屬性創建虛擬實現?

示例:我在插件體系結構(IPlugin)中有一個接口,並且有一個屬性可將元信息添加到屬性。然後我在插件實現中尋找具有此屬性的屬性以進行額外處理(存儲它的值,標記爲gui只讀...)

現在,當我創建一個模擬對象時,我可以輕鬆地將屬性添加到屬性或對象實例本身?

編輯:我發現了一個職位相同的問題 - >link。答案沒有100%,也就是Java ...

編輯2:這是可以做到...搜索一些(對SO),發現2個相關的問題(+答案)

herehere

現在,這是否已經在一個或另一個模擬框架中實現?

+0

你能提供更多你想測試的細節嗎?我在想,一個設計良好的單元測試會自行測試屬性,或者應用於虛擬類/成員。 – 2008-11-25 22:03:26

+0

增加了一個例子... – bob 2008-11-26 00:08:22

+2

您可以對此建議進行投票:[能夠向模擬對象添加自定義屬性](http://nhprof.uservoice.com/forums/28152-rhino-mocks-4-0/suggestions/654931-ability-to-add -custom-屬性到模擬對象)。 同時,請參閱[我可以讓Moq向模擬類添加屬性?](http://stackoverflow.com/questions/540636/can-i-get-moq-to-add-attributes-to-the-mock -類)。 – 2010-05-04 20:17:27

回答

1

下面是我測試自定義屬性的一個示例。在這種情況下,我有一個用於方法的自定義屬性。在我的測試類中,我創建了一個自定義屬性應用於其中的佔位符方法。然後我使用反射來獲取自定義屬性的實例。

[TestFixture] public class SomeRandomAttributeTest 
{ 
    [SomeRandom(RestrictionType.Local)] 
    public void PlaceholderMethodForAttribute() {throw new ApplicationException(this.ToString());} 

    [Test]public void BlahBlahIsBlahTheBlah() 
    { 
     object[] attributes = this.GetType().GetMethod("PlaceholderMethodForAttribute").GetCustomAttributes(false); 
     Assert.AreEqual(1, attributes.Length); 
     Assert.IsInstanceOfType(typeof(SomeRandomAttribute), attributes[0]); 

     Assert.AreEqual("Yada yada yada", ((SomeRandomAttribute) attributes[0]).Yada); 

    } 
} 
1

爲什麼你就不能這樣做:

var sut = new SomeRandomAttribute(RestrictionType.Local); 
Assert.AreEqual("Yada yada yada", sut.Yada); 

如果你想測試訪問所有類型和做一些東西,每個找到的SomeRandomAttribute的的代碼,我建議你在檢索用你的自定義屬性修飾的MethodInfo對象以及需要對這些對象執行的操作時將其拆分。給定正確配置的MethodInfo對象和屬性後,應該很容易進行測試。前者可以通過使用特定的測試佔位符來完成,就像Joseph建議的那樣。

0

這取決於你需要考什麼:

  • 測試的一些屬性的「功能」,如果你已經添加的屬性對類/方法它裝飾你可以創建一個虛擬一定效果類繼承IPlugin並使用該屬性並測試其行爲受到屬性存在或值的影響。
  • 如果您想測試屬性的某些內部功能,那麼只需創建該屬性並使用assert來驗證最終結果。

我不認爲你需要在這裏嘲笑。