gpt4 book ai didi

c# - 覆盖最小起订量中的 protected 方法

转载 作者:行者123 更新时间:2023-11-30 18:32:00 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com