.NET 单元测试的利剑——模拟框架Moq(简述篇)
.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参数
.NET 单元测试的利剑——模拟框架Moq(简述篇)的更多相关文章
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
常量,字段,构造方法 常量 1.什么是常量 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...
- JAVA单元测试的用法和要点(入门篇)
一.单元测试的目的? 单元测试是编写测试代码,用以检测特定的.明确的.细颗粒的功能! 严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试.现在一般公司都会进行业务流程的测 ...
- MVC单元测试,使用Repository模式、Ninject、Moq
本篇使用Repository设计MVC项目,使用Ninject作为DI容器,借助Moq进行单元测试. 模型和EF上下文 模型很简单: public class Foo { public int Id ...
- [转]模拟HttpContext 实现ASP.NET MVC 的单元测试
众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...
- ASP.NET MVC编程——单元测试
1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...
- 模拟HttpContext单元测试
众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...
- VisualStudio中的单元测试
1. VisualStuio中的测试资源管理器.CodeLens和ReSharper 上一篇文章重温了<单元测试的艺术>里提到的单元测试的技术及原则.这篇文章实践使用VisualStudi ...
- 浅谈.Net Core后端单元测试
目录 1. 前言 2. 为什么需要单元测试 2.1 防止回归 2.2 减少代码耦合 3. 基本原则和规范 3.1 3A原则 3.2 尽量避免直接测试私有方法 3.3 重构原则 3.4 避免多个断言 3 ...
- .NET单元测试的艺术-3.测试代码
开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...
随机推荐
- HashMap内部结构及实现原理
简单介绍 在研究HashMap之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能 数组:采用一段连续的存储单元来存储数据.对于指定下标的查找,时间复杂度为O(1):通过给定值进行查找,需 ...
- ZJOI2019一试游记
ZJOI2019一试游记 Day -2 早上颓刀剑,中午赶动车,写一会儿作业,下午赶车到酒店,发现跟杭二的巨佬一个酒店qwq 本来想测试一下我在人群中大叫一声ljc1301 AK ZJOI2019会有 ...
- Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域
昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...
- ScrollView嵌套子View的getDrawingCache为空的解决方法
ScrollView嵌套子View的getDrawingCache为空的解决方法 问题 将组件的显示布局改为可以滚动的,然后用ScrollView作为了View的父类,发现View的getDrawin ...
- RestTemplate远程调用POST请求:HTTP 415 Unsupported Media Type
这是本项目的接口 称为client @POST @Path("/{urlcode}") @Consumes(MediaTypes.JSON_UTF_8) @Produces(Med ...
- ubuntu 16.04 下安装动态链接库方法
一般先使用ldd 来查看该应用程序缺少什么东西,然后,再根据sudo apt install XXX 去安装相应的动态库. 假如没有对应的库,可以使用: sudo ln -s /usr/lib/lib ...
- elasticsearch 摘要
看终于有人把Elasticsearch原理讲透了!, 后总结: 反向索引又叫倒排索引,是根据文章内容中的关键字建立索引. 搜索引擎原理就是建立反向索引 elasticsearch在Lucene的基础上 ...
- 谷歌浏览器中安装Axure扩展程序
当使用谷歌浏览器预览Axure原型文件的时候,首次打开会出现以下界面: 我们按照图片中的步骤来即可,不过前提条件是翻.墙[我使用的是蓝灯,下载地址:https://github.com/getlant ...
- Java工程师修炼之路(从小白到BAT的两年学习历程)
作者:陆小凤 文章首发于:微信公众号[程序员江湖] 前言 在下本是跨专业渣考研的985渣硕一枚,经历研究生两年的学习积累,有幸于2019秋季招聘中拿到几个公司的研发岗offer,包括百度,阿里,腾 ...
- Gradle安装使用以及基本操作
这两天看到越来越多的在接触Gradle,然后发现我之前没有做过记录,而且之后下个月的一些有关SpringBoot的东西也需要用到,所以这里就来记录一下,方便以后使用. 简单介绍 Gradle是一个好用 ...