繁体   English   中英

Moq是派生类的基类函数

[英]Moq a base class function from a derived class

我是Moq的新手,我刚看了莫青的复数视频,所以我觉得有权去写一些测试。 我有一个基类让我们说Sheet实现了一个接口ISheet。 Sheet是页面的基类:

abstract class Sheet: ISheet
{
    public virtual void CreateSheet()  // Defined in ISheet
    {
    }
    public virtual void BuildSheet() // Defined in ISheet
    {
    }
    //and some abstract methods, etc.
}

public class Page : Sheet
{
    public override void CreateSheet()
    {
        BuildSheet(); // Base class implementation
    }
}

我覆盖了基类中的一个方法,即CreateSheet() ,但我想测试从派生类调用基类中的BuildSheet()方法:

所以在我的测试类中,我将SQ替换为接口而不是接口

var MockSheet = new Moq<Page>();

调用方法:

var actual = MockSheet.Object.CreateSheet(); 

然后验证

MockSheet.Verify(x => x.BuildSheet(), Times.AtLeastOnce);

相反,我得到MockException“在模拟上预期调用至少一次,但从未执行过。 永远不会调用CreateSheet方法。 如果我将CreateSheet方法更改为:

public void CreateDocSheet() // removed override
{
    BuildSheet() // base classses implementation
}

并在测试电话中:

var actual = MockSheet.Object.CreateDocSheet();  

有用。 我不明白为什么。 我相信在功能上这是一种有效的编码方式,我有工作表,有两页,我有一个接口,定义了应该实现的所有功能和属性,我在基类中实现这些功能,但不是全部方法需要在派生类中实现,因此,某些方法被覆盖,有些方法使用基类实现。 请解释为什么使用重写版本的函数是一个问题?

如果你改变了

var MockSheet = new Moq<Page>();

var MockSheet = new Moq<Page> { CallBase = true, };

你的mock(你可以把它看作是Page的派生类)将在mock自己的CreateSheet覆盖中调用Page的实现。

默认行为(如果您不更改CallBase )是Moq可以覆盖它可以使用的每个方法和属性,并使用实现。 CallBase设置为true会使Moq调用Page实现,就像我说的那样。

(当然,如果你想让CreateDocSheet做一些非常重要的事情,请使用MockSheet.Setup(x => x.CreateDocSheet()).Callback(() => { /* something */ }) 。)

在从CreateSheet删除virtual修饰符的情况下,Moq无法再覆盖或模拟此成员。 想一想:Moq如何“模拟”非虚拟方法? 因此,这个电话完全绕过了Moq的课程。

Moq用于模拟被测系统的依赖关系或依赖关系,以便您可以将其与其他应用程序或外部因素隔离开来,而不是替换被测系统。 它不适合你在这里尝试做什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM