覆盖Moq中的受保护方法

时间:2013-10-03 02:41:38

标签: c# moq

我有一个实现抽象类的类。抽象类有一个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 }

1 个答案:

答案 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); }
}

也可以。