2014-09-04 16 views
0

我有一個viewmodel類用作大量子類的基類。我現在將代碼添加到其中一個基類的方法中。單元測試,以確保所有的派生類正在調用一個基本的方法

protected virtual void OnLanguageChanged(CultureInfo culture) 
{ 
    CultureInfo.DefaultThreadCurrentCulture = culture; 
    CultureInfo.DefaultThreadCurrentUICulture = culture; 
} 

這是設置新線程的默認文化。

我想確保所有派生類,當他們重寫此方法時,他們稱之爲「base.OnLanguageChanged」。我如何編寫一個單元測試(我正在使用Moq),當至少有一個派生類不調用這個基本方法時,它將失敗。 viewmodel有一個名爲ChildViewModelCollection的屬性,它列出了所有的子視圖模型。我重寫的方法稱爲OnLanguageChanged()。這裏是什麼,我試圖做一個想法:

[TestMethod] 
public void OnLanguageChangeCalledByDerivedClasses() 
{ 
    var compositeViewModel = Container.Resolve<CompositeViewModel>(); 

    var children = compositeViewModel.ChildViewModelCollection; 

    var newCulture = new CultureInfo("fr-CA"); 
    // Call method so that children run their overridden methods 
    compositeViewModel.OnLanguageChanged(newCulture); 

    // Now how do I check if base.OnLanguageChanged was called by all children 
    foreach (var childViewModel in children) 
    { 

    } 

    Assert.AreEqual(CultureInfo.DefaultThreadCurrentCulture, CultureInfo.DefaultThreadCurrentUICulture); 
} 
+0

OnLanguageChanged是,在其中添加這兩行,或者是現有的功能基類中一個全新的函數? – 2014-09-04 15:54:18

+0

是的,它是一個沒有代碼的現有函數(開放和閉合圓括號)。我添加了兩行。 – Ray 2014-09-04 15:57:40

+0

所以代碼確實有當前覆蓋這個函數的子類? – 2014-09-04 15:59:49

回答

0

我@Ismail同意,也許在你的設計有點重構將是最好的,但如果你想只是檢查,如果你的子類調用基類方法,我認爲你可以使用代碼分析工具,如Nitriq(它是免費的),因爲你想要做的是比單元測試更多的代碼分析。

隨着Nitriq規則下面你可以檢查是否已OnLanguageChanged方法的類調用的方法內OnLanguageChanged:

var results = 
from method in Methods 
where 
    method.Name.Equals("OnLanguageChanged") 
&& !method.Calls.Any(c => c.Name.Equals("OnLanguageChanged")) 
select new { method.MethodId, method.Name }; 
Warn(results, 0); 
相關問題