.NET 单元测试的利剑——模拟框架Moq
前言
这篇文章是翻译文,因为通过自己参与的项目,越发觉得单元测试的重要性,特别是当跟业务数据打交道的时候的,Moq就如雪中送炭,所以想学习这个框架,就从这篇译文开始吧,顺便提升下自己英文阅读水平吧,由于英语实在不行,借助有道翻译有时候还理解不了原文的意思。凑合的看吧,下一篇介绍moq的使用demo
原文地址:https://github.com/moq/moq4
什么是Moq
Moq(发音—"mock-you"或是"mock")是一个针对.net开发只用于模拟的库,它充分利用了.NET LINQ表达式树和Lambda表达式的优势,使更具有生产效率,类型安全和友好重构的可模拟的类库。并且能像模拟Class类一样模拟Interface。API非常简洁和直接,不需要太多的前面的知识或是模拟概念的经验。
为什么?
因为这个库是由那些没有使用过任何模拟类库的开发者创建的(或是对那些已经实现的库太过复杂而不满),代表性的他们通过手动的去写他们自己的模拟(带着或多或少的“幻想”)。在这种情况下,大多数开发者非常关注实效,遵循TDD。这是一种感觉,从其他模拟库中进入的障碍有点高,而且有更简单,更轻量,更优雅的方法是有可能的。Moq通过带着C#简洁优雅以及VB的语言特性他们统一称为LINQ,能满足所有的上面说的这些(并不只是缩略词LINQ(查询)的意思)。
Moq被设计成为一个非常实用,直接的方式为你的测试去设置依赖。它的API设计甚至帮助初学者用户在“成功的坑”里并且能避免最常见的模拟错误。
当它被构思出来的时候,它就是唯一一个与那些有别于普通的和不直观的(特别是针对新手)记录/回放方法的模拟库框架(这是好的)
不使用Record/Replay也意味着将那些通常的期望转移到一个fixture设置方法是非常简单的,甚至能覆盖那些期望在特定的单元测试中。
你可以在 kzu's blog 看到更多关于“为什么?”的细节以及一些不错的截图信息。
下载安装
在kzu's blog 上看到更多关于mock的通知。从Scott Hanselman 获得一些模拟状态的背景知识
特征
Moq提供下面这些特征
- 强类型:没有字符串的期望,没有object类型的返回值或者是约束
- 智能提示:所有的一切都完美支持VS智能感知,从设置期望值,到指定方法调用参数,返回值等等。
- 不需要了解Record/Replay的习惯。只需要构造你的模拟,设置好并使用它,可选的验证它(你也许不做验证,当它作为存根(stubs)时,或者当你在做更传统的基于状态的测试时,通过检查对象返回的值)
- 前三点的影响,学习曲线非常低。在大多时候,你无需阅读文档。
- 通过简单的MockBehaviorm枚举对模拟的行为细粒度控制(Granular control)(无需模拟,存根(stub),伪造(fake),动态模拟等等)
- 接口和类都能模拟
- 覆盖期望:能设置默认的期望在一个fixture设置,并且根据测试需要覆盖
- 为模拟类传递构造函数参数
- 在模拟中截断器和触发事件
- 能支持out/ref参数