2010-08-10 44 views

回答

1

思考了幾個小時後,再讀一些TDD博客,我應該說,是的,我必須測試我的班級是否具有MEF屬性。

所以我重構上課前我寫那樣的單元測試:

[TestClass] 
public class When_SampleClass_mefable 
{ 
    [TestMethod] 
    [TestCategory("LFF.Kabu.Win.Login.ViewModel.SampleClass")] 
    public void Should_SampleClass_be_marked_with_Export_Attibute() 
    { 
     //arrange 
     var info = (typeof (SampleClass)); 

     //act 
     var attr = info.GetCustomAttributes(true); 

     var hasExportAttribute = 
      attr.Where(x => x.GetType() == typeof (ExportAttribute)) 
       .Where(x => ((ExportAttribute)x).ContractType == typeof(SampleClass)) 
       .Count() > 0; 
     //assert 
     Assert.IsTrue(hasExportAttribute, "SampleClass is not marked with Export."); 
    } 
} 

對於其他MEF屬性,如[ImportingConstructor]或[PartCreationPolicy]我做了同樣的方式。

3

您的測試應該更多地關注目標而不是機制。創建驗證,比如像「如果我在一個容器中拋出類型的X,Y和Z一起,那麼我就可以從容器拉一個IFoo的接口」的測試中,像這樣:

[Test] 
public void Can_get_IFoo_from_container_with_Foo_Bar_Baz() 
{ 
    var catalog = new TypeCatalog(typeof(Foo), typeof(Bar), typeof(Baz)); 
    using (var container = new CompositionContainer(catalog)) 
    { 
     var test = container.GetExportedValue<IFoo>(); 
    } 
} 

這不再是一個真正的「單元」測試,因爲它涉及多個類和一個IoC容器。我們把它們稱爲「組合測試」。

+0

嗯,我想當我做單元測試,然後我只想知道我的班(單位)行爲像預期。我真的不想測試它的組成,所以更多的MEF像預期的那樣工作。對於我的一段代碼,我只需要保證設置屬性。如果在運行時組合不符合我的進口或出口,那麼它不是我班(單位)的問題。你是否同意這一點? – blindmeis 2010-08-12 11:16:48

+0

@blindmeis:我不同意。 MEF屬性是僅與集成相關的元數據。你正在試圖將集成關注點放到單元測試中,這不適合。假設你在所有進口上改變合同類型,但忘記改變被測試的類的輸出。您的單元測試不會檢測到這一點:它將繼續驗證是否存在錯誤的導出屬性。我的測試會檢測到不匹配。 – 2010-08-12 12:41:59

+0

你對你的作文測試是正確的。但我看到我的單元測試就像它是一個單元測試。所以如果我改變合同,我做這種改變的單位將失敗,它應該。但後來我知道這是正確的需求變化,所以我必須改變我的單元測試。我看到你的作文測試是必要的,但比單元測試的水平要高。順便說一句,我只是做了測試,因爲我試圖學習tdd的方式。在那裏我有要求,我的課應該是mefable。 – blindmeis 2010-08-12 16:26:09

相關問題