https://www.cnblogs.com/haogj/archive/2011/07/22/2113496.html
https://www.cnblogs.com/darrenji/p/3869602.html
当使用Moq来Mock一个具体的类,类里的方法为virtual时,Moq会将当前类,所有的virtual方法默认重写成空实现。
如果我们想要访问真实的代码,有两种方法
1、在创建Mock时,设置CallBack为True:则整个类里所有的方法全访问真实代码
var mock = new Mock<ChildClass>() { CallBase = true}; mock.Object.ChildDo();
2、只想单个访问真实代码,可以Setup此方法后,调用.CallBase()方法
mock.Setup(a => a.ChildDo()).CallBase();
-------------------------------------
当我们要监控父类里的虚方法时,这里有一个很恶心的地方:
如果子类里使用base.BaseDo()来调用父类的功能,父类的BaseDo方法无法被重写,也无法监控。
如果子类里使用this.BaseDo()或直接写BaseDo()来调用父类的功能,则父类的BaseDo方法会被重写,也可以监控。
public class BaseClass { public virtual void BaseDo() { throw new Exception("BaseDo");//检测时请屏蔽 } } public class ChildClass : BaseClass { public void ChildDo() { base.BaseDo();//不重写BaseDo方法,会throw,不能通过Verify检测 //this.BaseDo();//会重写BaseDo方法,不会throw,能通过Verify检测 } } [TestClass] public class Test { [TestMethod] public void Testing() { var mock = new Mock<ChildClass>(); mock.Object.ChildDo(); mock.Verify(a => a.BaseDo(), Times.Once); } }
不知道理解的对不对?
扫描二维码关注公众号,回复:
7513995 查看本文章