【问题标题】:Unit test to ensure all derived classes are calling a base method单元测试以确保所有派生类都调用基方法
【发布时间】:2014-10-29 10:49:31
【问题描述】:

我有一个视图模型类,它用作大量子类的基类。我现在将代码添加到基类的方法之一。

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);
}

【问题讨论】:

  • OnLanguageChanged,是您在其中添加了这两行代码的现有函数,还是基类中的全新函数?
  • 是的,它是一个没有代码的现有函数(开括号和闭括号)。我添加了这两行。
  • 所以代码确实有当前覆盖此函数的子类?
  • @Ismail,是的,但我发现有些没有调用 base.OnLanguageChanged。他们现在必须调用它。
  • 这可能有点工作,但我认为最好的办法是通过更改要覆盖的函数来强制行为,请查看:stackoverflow.com/questions/3982673/force-base-method-call

标签: c# unit-testing moq


【解决方案1】:

我同意@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-01-01
    • 1970-01-01
    • 2017-06-12
    • 2014-04-30
    • 2014-03-17
    • 2014-09-05
    相关资源
    最近更新 更多