.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 看到更多关于“为什么?”的细节以及一些不错的截图信息。

下载安装

nuget 下载安装,并可以在上面查看 api文档

kzu's blog 上看到更多关于mock的通知。从Scott Hanselman 获得一些模拟状态的背景知识

特征

Moq提供下面这些特征

  • 强类型:没有字符串的期望,没有object类型的返回值或者是约束
  • 智能提示:所有的一切都完美支持VS智能感知,从设置期望值,到指定方法调用参数,返回值等等。
  • 不需要了解Record/Replay的习惯。只需要构造你的模拟,设置好并使用它,可选的验证它(你也许不做验证,当它作为存根(stubs)时,或者当你在做更传统的基于状态的测试时,通过检查对象返回的值)
  • 前三点的影响,学习曲线非常低。在大多时候,你无需阅读文档。
  • 通过简单的MockBehaviorm枚举对模拟的行为细粒度控制(Granular control)(无需模拟,存根(stub),伪造(fake),动态模拟等等)
  • 接口和类都能模拟
  • 覆盖期望:能设置默认的期望在一个fixture设置,并且根据测试需要覆盖
  • 为模拟类传递构造函数参数
  • 在模拟中截断器和触发事件
  • 能支持out/ref参数

.NET 单元测试的利剑——模拟框架Moq(简述篇)的更多相关文章

  1. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  2. JAVA单元测试的用法和要点(入门篇)

    一.单元测试的目的?      单元测试是编写测试代码,用以检测特定的.明确的.细颗粒的功能!  严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试.现在一般公司都会进行业务流程的测 ...

  3. MVC单元测试,使用Repository模式、Ninject、Moq

    本篇使用Repository设计MVC项目,使用Ninject作为DI容器,借助Moq进行单元测试. 模型和EF上下文 模型很简单: public class Foo { public int Id ...

  4. [转]模拟HttpContext 实现ASP.NET MVC 的单元测试

    众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...

  5. ASP.NET MVC编程——单元测试

    1自动化测试基本概念 自动化测试分为:单元测试,集成测试,验收测试. 单元测试 检验被测单元的功能,被测单元一般为低级别的组件,如一个类或类方法. 单元测试要满足四个条件:自治的,可重复的,独立的,快 ...

  6. 模拟HttpContext单元测试

    众所周知 ASP.NET MVC 的一个显著优势即可以很方便的实现单元测试,但在我们测试过程中经常要用到HttpContext,而默认情况下单元测试框架是不提供HttpContext的模拟的,本文通过 ...

  7. VisualStudio中的单元测试

    1. VisualStuio中的测试资源管理器.CodeLens和ReSharper 上一篇文章重温了<单元测试的艺术>里提到的单元测试的技术及原则.这篇文章实践使用VisualStudi ...

  8. 浅谈.Net Core后端单元测试

    目录 1. 前言 2. 为什么需要单元测试 2.1 防止回归 2.2 减少代码耦合 3. 基本原则和规范 3.1 3A原则 3.2 尽量避免直接测试私有方法 3.3 重构原则 3.4 避免多个断言 3 ...

  9. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

随机推荐

  1. Redux和React

    export app class Compo1 extends Component{ } Compo1.propType = { a:PropTypes.string, fn:PropTypes.fu ...

  2. linux下tomcat服务器的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  3. DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

  4. CLion之C++框架篇-优化框架,引入boost(三)

      背景   结合上一篇CLion之C++框架篇-优化框架,单元测试(二),继续进行框架优化!这一版优化引入一个我们日常经常使用的操作库Boost,估算使用频率在70%以上!   Boost的优势在哪 ...

  5. MySQL 游标(PREPARE预处理语句)

    概述 本章节介绍使用游标来批量进行表操作,包括批量添加索引.批量添加字段等.如果对存储过程.变量定义.预处理还不是很熟悉先阅读我前面写过的关于这三个概念的文章,只有先了解了这三个概念才能更好的理解这篇 ...

  6. Java基础巩固——异常

    基础回顾 什么是异常? 在Java程序运行时,常常会出现一些非正常的现象,这种情况称为运行错误.根据其性质可以分为错误和异常. Java程序中所有抛出的异常都必须从Throwable派生而来.类Thr ...

  7. vue单页应用前进刷新后退不刷新方案探讨

    引言 前端webapp应用为了追求类似于native模式的细致体验,总是在不断的在向native的体验靠拢:比如本文即将要说到的功能,native由于是多页应用,新页面可以启用一个的新的webview ...

  8. 一个xss漏洞到内网漫游【送多年心血打造的大礼包啦!】

    i春秋作家:jasonx 原文来自:一个xss漏洞到内网漫游[送多年心血打造的大礼包啦!] 前言 渗透过程中,有时候遇某些网站,明明检测到有xss漏洞,但是盲打以后,收到的cookie还是不能登录后台 ...

  9. Java Web 开发中的中文乱码与解决方式

    乱码产生的原因 不管是request乱码还是response乱码,其实都是由于客户端(浏览器)跟服务器端采用的编码格式不一致造成的.以request乱码为例:浏览器向服务器发送请求,因为浏览器与服务器 ...

  10. pycharm删除project

    1 在pycharm里面选择关闭project 2 返回到这个页面,然后点×让project不在project列表显示(最好记住project的位置) 3 到源文件夹删除这个project文件夹 大功 ...