我不知道你为什么会有不同的期望,你在模拟一个在你的具体实现中从未调用过的方法。
你现在的样子是这样的:
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); }
}
也可以。