这个篇幅里面,记录单元测试与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. 教你开发asp.net的单点登录系统

    单点登录系统,简称SSO.以下是我花了几个小时写的一个简单实现.特把实现思路和大家分享. 背景:某项目使用ASP.NET MemberShip来做会员系统,需要同时登录多个系统.而项目的开发人员无法在 ...

  2. Android:开发环境搭建相关问题

    1.Android.ADT.SDK概念与关系 SDK:Software Development Kit,中文意思是“软件开发工具包”.这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关 ...

  3. WEB开发中的字符集和编码

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  4. 在macOS Sierra 10.12搭建PHP开发环境

    macOS Sierra 11.12 已经帮我们预装了 Ruby.PHP(5.6).Perl.Python 等常用的脚本语言,以及 Apache HTTP 服务器.由于 nginx 既能作为 HTTP ...

  5. 【转载】Linux 文件系统的目录结构

    /bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令:比如 ls.cp.mkdir等命令:功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令.做为基础 ...

  6. Cmake的交叉编译

    http://www.cmake.org/Wiki/CMake_Cross_Compiling

  7. 《InsideUE4》GamePlay架构(十)总结

    世界那么大,我想去看看 引言 通过对前九篇的介绍,至此我们已经了解了UE里的游戏世界组织方式和游戏业务逻辑的控制.行百里者半九十,前述的篇章里我们的目光往往专注在于特定一个类或者对象,一方面固然可以让 ...

  8. 《InsideUE4》-10-GamePlay架构(九)GameInstance

    一人之下,万人之上 引言 上篇我们讲到了UE在World之上,继续抽象出了Player的概念,包含了本地的ULocalPlayer和网络的UNetConnection,并以此创建出了World中的Pl ...

  9. o(1)复杂度之双边滤波算法的原理、流程、实现及效果。

    一.引言     双边滤波在图像处理领域中有着广泛的应用,比如去噪.去马赛克.光流估计等等,最近,比较流行的Non-Local算法也可以看成是双边滤波的一种扩展.自从Tomasi et al等人提出该 ...

  10. IBM云的商务动作之我见(2):IBM 和 VMware 战略合作推进混合云

    本系列文章基于公开信息,对IBM云的近期商务动作比如收购.战略合作.整合等,给出本人的快速分析,仅仅代表本人个人观点,和本人所在的公司和所在的岗位没有任何关系: (1)IBM 收购 Blue Box ...