单元测试以确保所有派生类都调用基本方法

时间:2014-09-04 15:43:14

标签: c# unit-testing moq

我有一个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);
}

1 个答案:

答案 0 :(得分:0)

我同意@Ismail,也许在您的设计中进行一些重构将是最好的,但如果您只想检查您的子类是否正在调用基类方法,我认为您可以使用像{{3这样的代码分析工具(它是免费的),因为你想做的是比单元测试更多的代码分析。

使用下面的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);