MOQ的使用方法

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

不知道理解的对不对?

猜你喜欢

转载自www.cnblogs.com/yeagen/p/11706346.html