Moq是一个派生类的基类函数我刚接触Moq,刚刚看了墨青的复数视频,感觉有能力写一些测试.我有一个基类,比方说实现接口ISheet的Sheet。Sheet是页面的基类:abstractclassSheet:ISheet{publicvirtualvoidCreateSheet()//ISheet中定义{}publicvirtualvoidBuildSheet()//ISheet中定义//以及一些抽象方法等}publicclassPage:Sheet{publicoverridevoidCreateSheet(){BuildSheet();//基类实现}}我覆盖了基类CreateSheet()中的一个方法,但我想测试从派生类()方法调用基类中的BuildSheet:所以在我的测试类中,我替换了SQ使用接口而不是接口varMockSheet=newMoq();调用方法:varactual=MockSheet.Object.CreateSheet();然后验证MockSheet.Verify(x=>x.BuildSheet(),Times.AtLeastOnce);相反,我得到MockException“预期至少在模拟上调用一次,但从未执行过。从未调用过CreateSheet方法。如果我将CreateSheet方法更改为:publicvoidCreateDocSheet()//removedoverride{BuildSheet()//基类实现}并在测试调用中:varactual=MockSheet.Object.CreateDocSheet();有效。我不明白为什么。我相信从功能上讲这是一种有效的编码方式,我有2页的工作表,我有一个定义所有应该实现的函数和属性的接口,我在基类中实现这些函数,但并不是所有方法都需要要在派生类中实现,因此,一些方法被重写,一些方法使用基类实现。请解释为什么使用函数的覆盖版本会出现问题?如果你改变varMockSheet=newMoq();到varMockSheet=newMoq{CallBase=true,};你的mock(你可以认为它是Page的派生类)会在mock自己的CreateSheetoverride中调用Page的实现。默认行为(如果CallBase未更改)是Moq可以覆盖它可以使用的每个方法和属性,并使用空实现。将CallBase设置为true会使Moq调用Page实现,就像我说的那样。(当然,如果您希望CreateDocSheet做一些重要的事情,请使用MockSheet.Setup(x=>x.CreateDocSheet()).Callback(()=>{/*something*/})。)在CreateSheet的调用中使用virtual修饰符被移除,Moq不能再覆盖或模拟这个成员。想一想:Moq如何“模拟”一个非虚拟方法?因此,这个调用完全绕过了Moq的类。Moq用于模拟被测系统的依赖关系或依赖关系,以便您可以将其与其他应用程序或外部因素隔离开来,而不是更换被测系统。它不适用于您要在此处执行的操作。以上就是C#学习教程:Moq是派生类的基类函数共享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
