.NET使用Moq进行单元测试

本篇体验Moq的一些基本用法。首先通过NuGet安装Moq。

模拟方法的返回值

    public class HelperClass
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.Setup(x => x.IsEnabled()).Returns(true);
            Assert.AreEqual(mock.Object.IsEnabled(),true);
        }
    }
  • Moq模拟的方法一般是virtual虚方法,接口方法
  • mock.Object是指HelperClass的实例

模拟方法后执行回调函数

   [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            string temp = "";
            var mock = new Mock<HelperClass>();
            mock.Setup(x => x.IsEnabled()).Returns(true).Callback(() => { temp = "success"; });
            Assert.AreEqual(mock.Object.IsEnabled(),true);
            if (temp == "success")
            {
                //TODO
            }
        }
    }
  • 执行Return方法后,执行Callback回调方法,接收的参数类型是委托

模拟方法依次返回多个值

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.SetupSequence(x => x.IsEnabled())
                .Returns(true)
                .Returns(false);

            Assert.AreEqual(mock.Object.IsEnabled(),true);
            Assert.AreEqual(mock.Object.IsEnabled(), false);
        }
    }
  • SetupSequence方法可以为方法返回多个值

如果把以下2句:

Assert.AreEqual(mock.Object.IsEnabled(),true);
Assert.AreEqual(mock.Object.IsEnabled(), false);

颠倒一下顺序,变成:

Assert.AreEqual(mock.Object.IsEnabled(), false);
Assert.AreEqual(mock.Object.IsEnabled(),true);

结果,测试不通过。因为SutupSequence返回方法返回值的时候是有顺序的。

模拟第二次调用方法返回异常

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.SetupSequence(x => x.IsEnabled())
                .Returns(true)
                .Throws(new Exception());

            Assert.AreEqual(mock.Object.IsEnabled(),true);
            Assert.AreEqual(mock.Object.IsEnabled(), true);
        }
    }
  • 通过Throws方法,在第二次调用IsEnable()方法时抛出异常。

直接返回被模拟方法的原始返回值

    public class HelperClass
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass>();
            mock.CallBase = true;
            mock.SetupSequence(x => x.IsEnabled())
                .CallBase();
            Assert.AreEqual(mock.Object.IsEnabled(), true);
        }
    }

在被模拟的HelperClass类中,IsEnabled方法内部抛出异常。当把Moq实例的CallBase属性设置为true,并调用CallBase方法,可在测试方法中直接返回被模拟类中方法的原始返回值。

模拟泛型类

    public class HelperClass<T> where T : class
    {
        public virtual Boolean IsEnabled()
        {
            throw new Exception();
        }
    }
    public class Sample{}
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var mock = new Mock<HelperClass<Sample>>();
            mock.SetupSequence(x => x.IsEnabled()).Returns(true);
            Assert.AreEqual(mock.Object.IsEnabled(), true);
        }
    } 

到此这篇关于.NET使用Moq进行单元测试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • moq 的常用使用方法(推荐)

    Moq,就是Mock you.读音可以读成Mock~you.是Mock框架的一种.用于测试中的Mock测试.Mock是模拟的意思.Mock是模拟对象的一种技术. 测试方法 // 准备 Mock IFoo 接口 var mock = new Mock<IFoo>(); // 配置准备模拟的方法,当调用接口中的 DoSomething 方法,并传递参数 "bing" 的时候,返回 true mock.Setup(foo => foo.DoSomething("p

  • ASP.NET Core中使用xUnit进行单元测试

    单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多说了,有单元测试的做兜底的项目,好比给开发人员买了份保险,当然这个保险的质量取决于单元测试的质量,那些一路Mock的单元测试,看起来很美,但是什么都cover不到.目前工作中的一个老项目,有2万多个单元测试用例,其中不少是用心之作,真正落实到了业务逻辑,开发人员可以放心的去修改代码,当然一切都必须按

  • xUnit 编写 ASP.NET Core 单元测试的方法

    还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层做单元测试简直就是灾难啊..NET Core 吸取教训,在设计上考虑到了可测试性,就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的.其中面向接口和依赖注入在这方面起到了非常重要的作用. 本文就来手把手教你如何用 xUnit 对 ASP.NET Core 应用做单元测试..NET Core 常用的测试工具还有 NUnit 和 MSTest,我本人习惯用 x

  • .NET Core单元测试的两种方法介绍

    应用程序测试的类型很多,包括集成测试,Web 测试,负载测试等.在最底层的是单元测试,此测试可以测试单个软件组件或方法.单元测试一般只测试开发人员的代码,不应该测试基础结构普.问题,如数据库,文件系统或网络资源等.单元测试可以使用测试驱动开发(TDD)编写,也可以将它们添加到现有代码已确认其正确性. 在编写单元测试时,注意不要随意地在基础结构上引入依赖项.这些依赖项往往使测试更慢,更脆弱,因此应该将其保留用于继承测试.可以通过遵循显示依赖性原则,使用依赖注入从框架请求依赖关系,以此来避免应用程序

  • 详解.Net单元测试方法

    1.测试异常 可以直接对方法进行异常测试,也可以对模拟对象进行异常测试,但是,对模拟对象进行异常测试,很少用,所以,这里就介绍对方法的异常测试.请看如下代码,当用户名为空的时候,抛出异常. 例如 public bool Valid(string userName, string passWord) { if (string.IsNullOrEmpty(userName)) throw new ArgumentNullException("userName is null"); var

  • ASP.NET Core项目使用xUnit进行单元测试

    目录 一.前言 二.创建示例项目 1.UnitTest.Model 2.UnitTest.Data 3.UnitTest.IRepository 4.UnitTest.Repository 5.UnitTestDemo 6.TestDemo 三.编写单元测试 1.运行单元测试 2.调试单元测试 一.前言 在以前的.NET Framework项目中,我们也写过一些单元测试的项目,而在ASP.NET Core 这种Web或者API应用程序中要做单元测试是很方便的. 这篇文章主要讲解如何使用xUnit

  • .Net使用Xunit工具进行单元测试

    不管你爱与不爱,单元测试对于一个软件的长治久安还是必不可少的一环.在Visual Studio 2012后,VS中的测试浏览器也能与第三方的集成了,用起来还是非常方便的.目前在.Net框架下的测试工具主要有Nunit.内置的MSTest以及Xunit这三个工具,本文就简单的介绍一下如何在VS中使用XUnit这个测试框架的后起之秀. 安装Xunit: Xunit的安装现在不需要插件支持了,直接使用NuGet安装如下两个库即可: PM> Install-Package xunit PM> Inst

  • .NET使用Moq进行单元测试

    本篇体验Moq的一些基本用法.首先通过NuGet安装Moq. 模拟方法的返回值 public class HelperClass { public virtual Boolean IsEnabled() { throw new Exception(); } } [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { var mock = new Mock<HelperClass>(); mock

  • 浅谈.Net Core后端单元测试的实现

    1. 前言 单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题.具体是否应该落地单元测试,以及落地的程度, 每个项目都有自己的情况. 本篇为个人认为"如何更好地写单元测试", 即更加 偏向实践向 中夹杂一些理论的分享. 下列示例的单元测试框架为 xUnit , Mock库为 Moq 2. 为什么需要单元测试 优点有很多, 这里提两点我个人认为的很明显的好处 2.1 防止回归 通常在进行新功能/模块的开发或者是重构的时候,测试会进行回

  • AngularJs unit-testing(单元测试)详解

    javascript是一门动态类型语言,这给她带来了很强的表现能力,但同时也使编译器几乎不能给开发者提供任何帮助.因为这个原因,我们感受到编写任何javascript代码都必须有一套强大完整的测试.angular拥有许多功能,让我们更加容易地测试我们的应用.我们应该没有借口不去写测试(这个嘛--). 一. It is all about NOT mixing concerns(全部都关于避免代码关系变得复杂--) 单元测试,正如名称那样,是关于测试单个"单元"的代码.单元测试努力解答这

  • 对Python的Django框架中的项目进行单元测试的方法

     Python中的单元测试 我们先来回顾一下Python中的单元测试方法. 下面是一个 Python的单元测试简单的例子: 假如我们开发一个除法的功能,有的同学可能觉得很简单,代码是这样的: def division_funtion(x, y): return x / y 但是这样写究竟对还是不对呢,有些同学可以在代码下面这样测试: def division_funtion(x, y): return x / y if __name__ == '__main__': print division

  • 深入理解Golang的单元测试和性能测试

    前言 大家做开发的应该都知道,在开发程序中很重要的一点是测试,我们如何保证代码的质量,如何保证每个函数是可运行,运行结果是正确的,又如何保证写出来的代码性能是好的,我们知道单元测试的重点在于发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让线上的程序能够在高并发的情况下还能保持稳定.本小节将带着这一连串的问题来讲解Go语言中如何来实现单元测试和性能测试. go语言中自带有一个轻量级的测试框架testing和自带的go test命令来

  • 对Ruby on Rails进行高效的单元测试的教程

    在笔者开发的系统中,有大量的数据需要分析,不仅要求数据分析准确,而且对速度也有一定的要求的.没有写测试代码之前,笔者用几个很大的方法来实现这种需求.结果可想而知,代码繁杂,维护困难,难于扩展.借业务调整的机会,笔者痛定思痛,决定从测试代码做起,并随着不断地学习和应用,慢慢体会到测试代码的好处. 改变思路:能做到从需求到代码的过程转换,逐步细化: 简化代码:力图让每个方法都很小,只专注一件事: 优化代码:当测试代码写不出来,或者需要写很长的时候,说明代码是有问题的,是可以被分解的,需要进一步优化:

  • angularjs中的单元测试实例

    当ng项目越来越大的时候,单元测试就要提上日程了,有的时候团队是以测试先行,有的是先实现功能,后面再测试功能模块,这个各有利弊,今天主要说说利用karma和jasmine来进行ng模块的单元测试. 什么是Karma karma是一个单元测试的运行控制框架,提供以不同环境来运行单元测试,比如chrome,firfox,phantomjs等,测试框架支持jasmine,mocha,qunit,是一个以nodejs为环境的npm模块. 安装测试相关的npm模块建议使用----save-dev参数,因为

  • AngularJS 单元测试(二)详解

    使用对象模拟注入 我们可以非常容易的使用angularjs的$provider服务用一个对象模拟一个依赖并且注入. 例子如下 angular.module('artists',[]). factory('Artists',['imageStore',function(imageStore){ return { thumb:function(){ return imageStore.thumbnailUrl(id) } } }]) 如何实现 如何确定了服务 1.创建一个URL的引用,稍后会被moc

随机推荐