【发布时间】: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