3

我有一个实现抽象类的类。抽象类有一个protected virtual方法,如下所示:

protected virtual void OnAction(string action, object result);

实现抽象类的类有一个在完成时调用的方法base.OnAction

我试图在我的单元测试中覆盖 OnAction 实现的行为,因为我只尝试进行单元测试,而不是进行集成测试。

我的起订量调用设置如下:

mock.Protected().Setup("OnAction", ItExpr.IsAny<string>, ItExpr.IsAny<object>());

断点我的基本抽象类OnAction方法确认它仍在被调用。

我本质上希望 Moq 在它的发射类中做同样的事情:

public override OnAction(string action, object result) { // do nothing }
4

1 回答 1

-1

我不确定为什么你会期望不同,你在模拟一个在你的具体实现中从未调用过的方法。

您目前拥有的内容如下所示:

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

也可以。

于 2013-10-03T03:15:16.437 回答