作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个实现抽象类的类。抽象类有一个 protected virtual
方法,如下所示:
protected virtual void OnAction(string action, object result);
实现抽象类的类有一个方法,完成后调用 base.OnAction
。
我试图在我的单元测试中覆盖 OnAction 实现的行为,因为我试图只进行单元测试,而不是进行集成测试。
我的 Moq 调用设置如下:
mock.Protected().Setup("OnAction", ItExpr.IsAny<string>, ItExpr.IsAny<object>());
断点我的基本抽象类 OnAction
方法确认它仍在被调用。
我基本上希望 Moq 在它发出的类中做等效的事情:
public override OnAction(string action, object result) { // do nothing }
最佳答案
我不确定为什么你会期望不同,你在模拟一个在你的具体实现中永远不会调用的方法。
你现在看起来像这样:
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); }
}
同样有效。
关于c# - 覆盖最小起订量中的 protected 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19149905/
我是一名优秀的程序员,十分优秀!