这个篇幅里面,记录单元测试与Moq模拟包的知识点。

单元测试

每一个模块,都应该有对应的单元测试。单元测试可以保证你的代码准确性,大大减少出现BUG的几率。一个好的单元测试,也是重构代码必不可少的部分。

我们可以直接在vs中,新增单元测试项目。

类库中,只要声明TestClass,就当做是单元测试。

单元测试分为三部分:准备,行为,断言。其中准备和行为,就是模拟程序代码执行。断言,就是判断程序执行结果与预期结果是否一致。

断言使用:Assert类来实现。详细参见:Assert类

[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void Index()
{
// Arrange
HomeController controller = new HomeController(); // Act
ViewResult result = controller.Index() as ViewResult; // Assert
Assert.IsNotNull(result);
} [TestMethod]
public void About()
{
// Arrange
HomeController controller = new HomeController(); // Act
ViewResult result = controller.About() as ViewResult; // Assert
Assert.AreEqual("Your application description page.", result.ViewBag.Message);
} [TestMethod]
public void Contact()
{
// Arrange
HomeController controller = new HomeController(); // Act
ViewResult result = controller.Contact() as ViewResult; // Assert
Assert.IsNotNull(result);
}

Moq

Moq是针对Net开发的模拟库。他的目标是让模拟以一种自然的方式与现有的单元测试进行集成,使他更加直观。

我们可以使用nuget,来获取Moq包。或者访问其官网,不过被墙了。

局限性

模拟的类不能为密封类。不能直接模拟静态方法。Moq只能创建模拟对象的实例。可以通过模拟的方式让他去访问service,并且根据不同的请求模拟返回响应的结果。

原理

Moq只需要一个接口,就可以产生一个对象。利用反射机制来动态生成一个空框架,用于模仿对象的行为。

Mock

通过Mock<T>这个类,我们就可以创建一个对象的模拟。T可以使接口或者类。但必须有public和virtual属性。

通过IFake接口,去动态创建Mock。然后使用Setup方法去创建我们需要的对象。当模拟的对象调用它自己方法的时候,并且参数是Ping。

最后Return返回对应结果,前面的请求返回结果为真。这是我们指定的返回值。当请求调用DoSomething并且传递Ping,那么就返回true。

 public interface IFake
{
bool DoSomething(string actionname);
} [TestMethod]
public void Test_Interface_IFake()
{
var mo = new Mock<IFake>();
mo.Setup(f => f.DoSomething("Ping")).Returns(true);
mo.Setup(f => f.DoSomething("PingF")).Returns(false);
Assert.AreEqual(true, mo.Object.DoSomething("Ping"));
Assert.AreEqual(false, mo.Object.DoSomething("PingF"));
}

IT

It是一个静态类,定义了静态方法。可以使用泛型来指定值。

It.IsAny<string> 表示只要传入任何String即可。

It.Is<int>(id=>id>0 && id<6) 表示必须传入0到6的区间,才可以返回。

It.IsIn<string> 表示可以传入的区间。 具体内容可以查看IT的接口

[TestMethod]
public void User_Can_Send_Password()
{
var email = new Mock<IEmailSender>();
email.Setup(f => f.Send(It.IsAny<string>(), It.Is<string>(id => id != "Chenxy"), It.IsAny<string>())).Returns(true);
Assert.AreEqual(true, email.Object.Send(It.IsAny<string>(), It.IsAny<string>(), It.IsIn<string>("", "", "")));
}

压力测试工具

HttpTest4Net:http://www.cnblogs.com/smark/p/3636873.html

占位符

单元测试与Moq的更多相关文章

  1. 单元测试模拟-moq

    1.moq 支持 net core 2.moq 通过一个接口类型 可以产生一个新的类 3.举例 //define interface to be mocked public interface ITe ...

  2. 学习笔记之Moq

    dotnet/src/MoqSample at master · haotang923/dotnet · GitHub https://github.com/htanghtang/dotnet/tre ...

  3. Moq基础 判断方法被执行

    如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次 本文是一个系列,具体请看 Moq基础(一) 为什么需要单元测试框架 Moq基础(二) 快 ...

  4. 自学MVC看这里——全网最全ASP.NET MVC 教程汇总

    MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从 ...

  5. .NET WEB程序员需要掌握的技能

    本来这个是我给我们公司入职的新人做一个参考,由于 @张善友 老师在他的微信号转了我的这篇文章<<.Net WEB 程序员需要掌握的技能>>,很多人觉得比较有用,说是看了后知道一 ...

  6. C#重构之道

    定义 重构的定义:在不改变软件可观察行为的前提下,改善其内部结构. 其中,不改变软件行为,是重构最基本的要求.要想真正发挥威力,就必须做到“不需了解软件行为”. 如果一段代码能让你容易了解其行为,说明 ...

  7. 需要注意学习.net过程的要点

    基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC (Web Form 用的越来越少,如果你不熟悉,可以不看) JavaScript 基础语法 如何在HT ...

  8. 哎哟,我的.NET呀

    今早无意看到一篇文章,看着.Net被喷得越来越惨,终于还是有人忍不住要奋起反抗了哇! 虽然我已经转了java(大致方向)(没想到我是转的java方向!)好吧!其实也不算是转,就像文章所说的,我最多算是 ...

  9. ASP.NET MVC 教程汇总

    自学MVC看这里——全网最全ASP.NET MVC 教程汇总   MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要 ...

随机推荐

  1. SQL SERVER修改排序规则——脚本篇

    在上篇MS SQL 排序规则总结中,大致就数据库服务器排序规则(或者叫数据库实例排序规则).数据库排序规则.列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库实例排序规则),其中 ...

  2. SQL Server自动化运维系列——监控性能指标脚本(Power Shell)

    需求描述 一般在生产环境中,有时候需要自动的检测指标值状态,如果发生异常,需要提前预警的,比如发邮件告知,本篇就介绍如果通过Power shell实现状态值监控 监控值范围 根据经验,作为DBA一般需 ...

  3. 烂泥:Postfix邮件服务器搭建之虚拟用户配置

    virtual_gid_maps = static: virtual_transport = dovecot dovecot_destination_recipient_limit = 1 注意:po ...

  4. 云与备份之(1):VMware虚机备份和恢复

    本系列文章会介绍云与备份之间的关系,包括: (1)VMware 虚机备份和恢复 (2)KVM 虚机备份和恢复 (3)云与备份 (4)OpenStack 与备份 (5)公有云与备份 1. 与备份有关的V ...

  5. 基于网格的分割线优化算法(Level Set)

    本文介绍一种网格分割线的优化算法,该方法能够找到网格上更精确.更光滑的分割位置,并且分割线能够自由地合并和分裂,下面介绍算法的具体原理和过程. 曲面上的曲线可以由水平集(level set)形式表示, ...

  6. springboot Serving Web Content with Spring MVC

    Serving Web Content with Spring MVC This guide walks you through the process of creating a "hel ...

  7. 第15章 LinkedList类(暂无)

    第15章 LinkedList类 LinkedList类是

  8. Python的列表推导式,字典推导式,集合推导式使用方法

    推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...

  9. Unity 下载存档

    各种版本的UNITY下载 https://unity3d.com/cn/get-unity/download/archive

  10. 利用Theme自定义Activity间的切换动画

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/22990643 大多Android系统默认Activity间的动画切换效果为,右边 ...