我有一个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 :(得分: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);