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

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

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

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

stub:

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

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

Fakes里的stub和shim的区别的更多相关文章

  1. 使用Fakes的Stub和Shim对ASP.NET MVC4进行单元测试

    这是一篇导航文,不是翻译. MSDN对stub和shim的解释和使用场景演示:http://msdn.microsoft.com/en-us/library/hh549175.aspx 一个更详细的示 ...

  2. C++ 里大写TRUE和小写true区别

    1.C++里大写TRUE和小写true区别 true是bool型的: TRUE是int型的,VC里这个是ms自己定义的: C++规定不允许只通过返回类型不同区别两个函数 2.MFC中的”false“和 ...

  3. mootools里选择器$,$$,$E,$ES等的区别

    区别就是 $和$$都是1个参数, $适用于ID,或者ID代表的对象 $$适用于CSS选择器 $E和$ES,有2个参数,第二个参数是可选参数代表(filter,即某个ID范围里的元素) $E('inpu ...

  4. Python 3. 里filter与generator expression的区别

    # -*- coding: utf-8 -*- """ A test to show the difference between filter and genrator ...

  5. <script>标签里的defer和async属性 区别(待补充)

    defer与async的区别(表格显示): table th:first-of-type { width: 150px; } table th:nth-of-type(2) { } 区别 defer ...

  6. Spring中applicationContext.xml的bean里的id和name属性区别

    转自:http://www.cnblogs.com/ztf2008/archive/2009/02/11/1388003.html <beans><bean id="per ...

  7. 一张图看懂css的position里的relative和absolute的区别

    position有以下属性:static.inherit.fixed.absolute.relative前三个好理解好区分:static:是默认状态,没有定位,元素出现在正常的流中(忽略 top, b ...

  8. shell 脚本里的$(( ))、$( )、``与${ }的区别

    shell  脚本里的命令执行 1. 在bash中,$( )与` `(反引号)都是用来作命令替换的. 命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组 ...

  9. yii框架里DetailView视图和GridView的区别

    1,首先从语义上分析 DetailView是数据视图,用于显示一条记录的数据,相当于网页中的详情页 GridView是网格视图,用于显示数据表里的所有记录,相当于网页里的列表页 2.用法上的区别 首先 ...

随机推荐

  1. appium问题汇总(持续更新。。。)

    WEBVIEW_unknown adb版本较低,adb 1.0.32版本不支持安卓8.x版本,更新adb版本后正常 Install homebrew ruby -e "$(curl -fsS ...

  2. chrome 調試 node 代碼

    (1)node --inspect-brk debug/demo (2)通过 chrome 进行调试    (3) chrome://inspect 进入chrome调试界面    --inspect ...

  3. IDEA八条配置修改

    IDEA版本:IntelliJ IDEA 2019.2.1 x64 八条配置修改: 自动编译开关 忽略大小写开关 智能导包开关 悬浮提示开关 取消单行显示tabs的操作 项目文件编码 滚轴修改字体大小 ...

  4. MongoDB 分片管理(一)检查集群状态

    一.检查集群状态 1.1 使用sh.status()查看集群摘要信息 1.使用sh.status()可以查看分片信息.数据库信息.集合信息 sh.status() 如果数据块较多时,使用sh.stat ...

  5. 多路径技术:ALUA与SLUA

    实现的核心 通过存储设备去适配操作系统,从而实现多路径技术,支持ALUA是其中主要部分.   ALUA多路径技术 Asymmetric Logical Unit Access,非对称逻辑单元存取,其提 ...

  6. 怎么新开一个组件并且配置路由?vue-cli

    首先要明白: 路由就是url路径,如果一个组件被引入到了另外一个组件,这个页面就包含这个组件了,所以这个被包含的组件不要去路由哪里配置了 第一步: 先写上想要添加的组件 2.组件的内容 3.路由的配置 ...

  7. GCC与GDB使用

    GCC基本命令 gcc[选项][文件名] -E:仅执行编译预处理(.c->.i) -S:将c代码转换成汇编代码(.i->.s) -c:仅执行编译操作,不进行连接操作(.s->.o) ...

  8. Linux make menuconfig打开失败

    OS:Ubuntu 16.04 LTS 使用“make menuconfig”配置kernel时,提示make menuconfig打开失败 $ make menuconfig *** Unable ...

  9. 项目中一次排序规则的改动,注意到js中map的遍历的顺序

    背景:项目需要对前端页面上某个插件的下拉选择项进行排序,需要按照配置的顺序显示. 首先调查后台,发现sql语句中已经添加order by.之后发现查询结果遍历后封装进HashMap,这里改为LinkH ...

  10. P5658 括号树

    P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解  题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合 ...