单元测试与Moq

这个篇幅里面,记录单元测试与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>("1", "2", "3")));
        }

占位符

时间: 2024-11-02 21:35:49

单元测试与Moq的相关文章

【基础知识】列一下一个.Net WEB程序员需要掌握的知识

基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC (Web Form 用的越来越少,如果你不熟悉,可以不看) JavaScript 基础语法 如何在HTML里使用JavaScript 常用Dom 操作 SQL Server 常用T-SQL 增删改查 SQL Managment studio 常用操作 jQuery 常用API HTML HTML 所有标签的语义,什么时候用什么标签 CSS 常用CSS的知识,如何在HTML使用 常用的布局 Boots

第7章 SportsStorePeta 一个真实的应用程序

SportsStorePeta应用程序开发 步骤: 1.创建解决方案和项目(Domain.WebUI.UnitTests) 2.添加引用 3.设置ID容器 4.设计域模型 5.创建抽象存储库 6.创建模仿存储库 7.添加控制器.动作及视图 8.设置路由 9.准备数据库及数据表 10.创建实例框架上下文 11.创建产品存储库 12.添加分页 13.改进路由及URL 14.设置内容样式CSS 15.创建分部视图 一.解决方案:SportsStorePeta,该应用程序将不使用EF,而使用PetaPo

全网最全ASP.NET MVC 教程汇总

全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASp.NET MVC 框架知识,Let’s go! 1. Why :为什么需要ASP.NET MVC 本章主要为大家汇总了为什么学习Asp.net MV

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

基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC (Web Form 用的越来越少,如果你不熟悉,可以不看) JavaScript 基础语法 如何在HTML里使用JavaScript 常用Dom 操作 SQL Server 常用T-SQL 增删改查 SQL Managment studio 常用操作 jQuery 常用API HTML HTML 所有标签的语义,什么时候用什么标签 CSS 常用CSS的知识,如何在HTML使用 常用的布局 Boots

哎哟,我的.NET呀

今早无意看到一篇文章,看着.Net被喷得越来越惨,终于还是有人忍不住要奋起反抗了哇! 虽然我已经转了java(大致方向)(没想到我是转的java方向!)好吧!其实也不算是转,就像文章所说的,我最多算是下等马! 但对.net还是很怀念的!借以此篇,用来怀念我对.net的思念吧![顺便附上博文里张善友老师的.net终身成就路线] 基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC (Web Form 用的越来越少,如果你不熟悉,可以不看) JavaScr

一些.NET 项目中常用的类库

Web自动化测试   Watin Selenium  Selenium git .net 集合类扩展实现C5 Subscriber/Publisher 模式 Rx Nats 防御式编程 断言库 流畅接口实现 CuttingEdge Conditions 序列化JSON.Net Protobuf.Net 元编程IL Wave类库 Cecilpostsharp 单元测试Xunit Moq AAA模式 一个方便创建Dummy 对象的类库 文件操作 Excel 操作CSV操作Pdf操作 OAuth oA

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

本来这个是我给我们公司入职的新人做一个参考,由于 @张善友 老师在他的微信号转了我的这篇文章<<.Net WEB 程序员需要掌握的技能>>,很多人觉得比较有用,说是看了后知道一步步怎么学,这个让我受宠若惊,另外我看到有些同学文章引用了这部分,但是格式很乱看不清楚,所以我就重新整理一下在博客园发一下,希望对更多人有用,也希望大家补充. 基础部分 C# 基础语法 OOP的概念,面向对象的理解 继承 封装 多态 ASP.NET MVC ( Web Form 用的越来越少,如果你不熟悉We

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

自学MVC看这里——全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口.本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASp.NET MVC 框架知识,Let’s go! 1. Why :为什么需要ASP.NET MVC 本章主要为大家汇总了为什么学习

【非月结贴】.NET开发者不要再抱怨.NET工资了,你真的行吗?--从一个刚入行不久的角度看.NET工资

最近博客园里面很多人都说.NET不行,其实你们说的.NET不行也就是说.NET的工资比不上Java,PHP,移动开发等 本人性格还没有修炼到淡定,所以下面可能屡有偏激狂妄之词,也请同仁多多海涵. 咱们大多数人搞开发都是要赚钱养家的.我们都不说是为了中华软件而崛起的口号而编码,这样的口号我也喊不出来. 我们都是为了工资,为了赚钱养家.兴趣也是一部分.看了博客园这些喷.NET的文章,在这里我也想站在一个刚入门的人的立场上来谈一下这个问题 本人作为一个大四软件工程专业的学生,刚入行不久,.NET从大一