我有一个实现抽象类的类。抽象类有一个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 }
答案 0 :(得分:0)
我不确定为什么你会期望不同,你在嘲笑一个从未在具体实现中调用过的方法。
您目前看起来像这样:
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); }
}
这将使您的测试功能成为您想要的,但它可以说明您的设计存在缺陷,这是必要的。
*编辑
正如马修指出的那样,实际上并不需要覆盖它。
public class Herple : Derple
{
public void DoTheHerple(string action, object result) { OnAction(action, result); }
}
也可以。