我不确定为什么你会期望不同,你在模拟一个在你的具体实现中从未调用过的方法。
您目前拥有的内容如下所示:
public abstract class Derple
{
protected virtual void OnAction(string action, object result) { Console.WriteLine("Derple"); }
}
public class Herple : Derple
{
public void DoTheHerple(string action, object result) { base.OnAction(action, result); }
}
因此,通过模拟该Herple
OnAction
方法,您正在模拟从未调用过的东西,因为具体DoTheHerple
调用仍在调用基类实现。
解决此问题的一种丑陋方法是覆盖子类中的方法,并在那里调用基类方法,然后this.OnAction
在子类方法中调用。
public abstract class Derple
{
protected virtual void OnAction(string action, object result) { Console.WriteLine("Derple"); }
}
public class Herple : Derple
{
protected override void OnAction(string action, object result) { base.OnAction(action, result); }
public void DoTheHerple(string action, object result) { this.OnAction(action, result); }
}
这将使您的测试功能如您所愿,但可以说它表明您的设计存在缺陷,这是必要的。
*编辑
正如 Matthew 指出的那样,覆盖实际上并不是必需的。
public class Herple : Derple
{
public void DoTheHerple(string action, object result) { OnAction(action, result); }
}
也可以。