Fakes里的stub和shim的区别

stub常用于虚拟接口、类、方法,无法重写静态方法(stub需要传递到具体调用代码中)

shim常用于重写静态方法(在ShimsContext.Create()作用域内,拦截Runtime动态修改方法的实现,静态方法无需传递)

shim如果用于重写非静态方法,依然需要传递

以下两种的目的都是虚拟TokenHandler.GetToken这个方法

stub:

            var stubTokenHandler = new StubTokenHandler<Token>("user")
            {
                GetToken = () => { return new Token() { UserId = 1 }; }
            };

shim:(可以和stub一样直接修改GetToken方法,但就无法达到全局调用的目的;下面的例子里是通过Factory静态方法调用,虚拟整个类的实现以达到全局可调用的目的)

            using (ShimsContext.Create())
            {
                ShimTokenFactory.TokenHandler = () =>
                {
                    return new TokenHandlerDefine(1);
                };
            }
    public class TokenHandlerDefine : TokenHandler<Token>
    {
        private int userId;
        public TokenHandlerDefine(int userId)
        {
            this.userId = userId;
        }

        public override Token GetToken()
        {
            return new Token() { UserId = userId };
        }
    }
    public class TokenFactory
    {
        public static TokenHandler<Token> TokenHandler()
        {
            return new TokenHandler<Token>("user");
        }
    }
原文地址:https://www.cnblogs.com/yeagen/p/11718813.html