前言

今天大姚给大家推荐一个.NET开源、流行、使用简单的.NET模拟库:Moq

Moq类库介绍

Moq是一个.NET开源、流行、使用简单的 .NET 模拟库,充分利用了.NET 的 Linq 表达式树和 lambda 表达式。这使得 Moq 成为最具生产力、类型安全且支持重构的模拟库。它不仅支持模拟接口,还支持模拟类。其 API 非常简单直观,不需要任何关于模拟概念的事先知识或经验。从而简化单元测试中的依赖管理和验证过程,提高代码的可测试性和可维护性。

创建控制台应用

首先我们创建一个名为:MoqExercise 的.NET 8控制台应用:

安装Moq NuGet

创建模拟对象

以下是一个简单的示例,展示如何使用 Moq 来快速创建 IUserInfo 的模拟对象:

    public interface IUserInfo
    {
        string UserName { get; set; }
        int Age { get; set; }

        string GetUserData();
    }

    public static void UserInfoTest()
    {
        // 创建 IUserInfo 的模拟对象  
        var mockUserInfo = new Mock<IUserInfo>();

        // 设置模拟对象的属性值  
        mockUserInfo.SetupProperty(u => u.UserName, "大姚");
        mockUserInfo.SetupProperty(u => u.Age, 27);

        // 设置 GetUserData 方法的返回值  
        mockUserInfo.Setup(u => u.GetUserData()).Returns("UserName: 大姚, Age: 25");

        // 获取模拟对象的实例
        var userInfo = mockUserInfo.Object;

        // 调用方法并输出结果  
        Console.WriteLine(userInfo.GetUserData());
        Console.WriteLine("UserName: {0}, Age: {1}", userInfo.UserName, userInfo.Age);
    }

验证调用的参数

在单元测试中,验证方法的调用参数也是非常重要的。Moq框架提供了Verify方法,帮助开发者可以轻松地验证这些方面。

    public interface IVerifyService
    {
        void Process(int value);
    }

    public class VerifyServiceClient
    {
        private readonly IVerifyService _service;

        public VerifyServiceClient(IVerifyService service)
        {
            _service = service;
        }

        public void Execute(int[] values)
        {
            foreach (var value in values)
            {
                _service.Process(value);
            }
        }
    }

        public static void VerifyTest()
        {
            // 创建模拟对象
            var serviceMock = new Mock<IVerifyService>();

            // 创建被测试对象并注入模拟对象
            var serviceClient = new VerifyServiceClient(serviceMock.Object);

            // 执行测试
            serviceClient.Execute([1, 2, 3]);

            // 验证方法调用次数和参数
            serviceMock.Verify(x => x.Process(1));
            serviceMock.Verify(x => x.Process(3));
            serviceMock.Verify(x => x.Process(2));
            //serviceMock.Verify(x => x.Process(12));   //这里会抛出异常,表示验证失败

            // 如果运行到这里没有抛出异常,表示验证通过
            Console.WriteLine("验证通过!");
        }

模拟抛出异常

在单元测试中使用 Moq 框架时,可以模拟接口的方法抛出异常。

        public static void TestThrowException()
        {
            // 创建 IUserInfo 的模拟对象
            var mockUserInfo = new Mock<IUserInfo>();

            // 设置 GetUserData 方法在调用时抛出异常  
            mockUserInfo.Setup(x => x.GetUserData()).Throws(new Exception("模拟的异常"));

            // 获取模拟对象的实例
            var userInfo = mockUserInfo.Object.GetUserData();
        }

项目源码地址

更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。

DotNetGuide技术社区

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目框架推荐、求职和招聘资讯、以及解决问题的平台。
  • 在DotNetGuide技术社区中,开发者们可以分享自己的技术文章、项目经验、学习心得、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台。无论您是初学者还是有丰富经验的开发者,我们都希望能为您提供更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群

.NET使用Moq开源模拟库简化单元测试的更多相关文章

  1. 在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet

    最近在做一个项目的单元测试时,遇到了些问题,解决后,觉得有必要记下来,并分享给需要的人,先简单说一下项目技术框架背景: asp.net core 2.0(for .net core)框架 用Entit ...

  2. arcgis api for js之echarts开源js库实现地图统计图分析

    前面写过一篇关于arcgis api for js实现地图统计图的,具体见:http://www.cnblogs.com/giserhome/p/6727593.html 那是基于dojo组件来实现图 ...

  3. arcgis api 3.x for js 之 echarts 开源 js 库实现地图统计图分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  4. 开源的库RestSharp轻松消费Restful Service

    现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流..NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理 ...

  5. Linux下经常使用的C/C++开源Socket库

    1.      Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html 2.      ACE: h ...

  6. Linux下经常使用的C/C++开源Socket库【转】

    转自:https://www.cnblogs.com/gccbuaa/p/7015599.html 1.      Linux Socket Programming In C++ : http://t ...

  7. Pugixml一种快速解析XML文件的开源解析库

    Pugixml是一个轻量级的C++ XML开源解析库,DOM形式的解析器.接口和丰富的遍历和修改操作,快速的解析,此外支持XPath1.0实现数据查询,支持unicode编码: 使用Pugixml可通 ...

  8. iOS流行的开源代码库

    本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...

  9. 从Google开源RE2库学习到的C++测试方案

    最近因为科研需求,一直在研究Google的开源RE2库(正则表达式识别库),库源码体积庞大,用C++写的,对于我这个以前专供Java的人来说真的是一件很痛苦的事,每天只能啃一点点.今天研究了下里面用到 ...

  10. 爆料喽!!!开源日志库Logger的剖析分析

    导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...

随机推荐

  1. MySQL编译安装-麒麟V10 x86

    环境信息 操作系统: Kylin Linux Advanced Server V10 (Sword) 架构:X86 MySQL版本:5.7.44 编译 安装必要的依赖库和编译工具 sudo yum g ...

  2. UVA11367 Full Tank?

    优先队列bfs 1 #include<cmath> 2 #include<queue> 3 #include<cstdio> 4 #include<strin ...

  3. 新手入门 | 搭建 AI 模型开发环境

    目录 安装显卡驱动和开发库 对于 Tesla 系列显卡 对于 N 卡 安装 CUDA 和 cuDNN 安装 Miniconda 安装 PyTorch 和 Transformers 使用 Modelsc ...

  4. 移动端Android跟ios兼容性问题,反人类!!!

    一.查询参数编码问题 我们在日常开发中,有时候会遇到拼接参数特别多的情况,那么就会导致一行代码特别长.那么为了美观呢,有的同学会进行换行处理,如下代码: 可以看到我红色框出来的地方就是经过了手动的回车 ...

  5. AWS 认证

    Data Analytics: 准备先Fundamental, 然后Udemy 上买课程,在看Exam Readiness, 然后小测试一下水平,看白皮书,最后不行就 Guru上再买课程 https: ...

  6. LCD屏幕显示PNG图像

    正点原子LCD屏幕显示PNG图像 本文概要 这段时间在学习正点原子的IMX6ULL开发板,在应用编程中有一个代码练习是需要在LCD屏幕上显示PNG图像,但由于我的屏幕参数和教程中的有些出入,于是经过自 ...

  7. web前端常用的五种方式搭建本地静态html页面服务器

    方式一:live-server live-server是一款npm工具,可以在项目目录启动一个node服务,然后直接在浏览器中预览,并且自动全局监听实时更新. 两种安装方式: 全局安装 npm i l ...

  8. Coze插件发布!PDF转Markdown功能便捷集成,打造你的专属智能体

    近日,TextIn开发的PDF转Markdown插件正式上架Coze平台. 在扣子搜索"pdf转markdown",或在Coze平台搜索"pdf2markdown&quo ...

  9. Identity – 安全基础知识

    前言 一旦涉及到用户, 那么安全就上一个层次了. 这篇主要是说说一些安全的基础 用户密码保存 网络上有太多资料说这些基础了, 我就不拉过来了. 大致记入一些重点就好了. - 为什么不可以明文保存 因为 ...

  10. LLM应用实战: 文档问答系统Kotaemon-1. 简介及部署实践

    1.背景 本qiang~这两周关注到一个很火的开源文档问答系统Kotaemon,从8月28日至今短短两周时间,github星标迅猛增长10K,因此计划深挖一下其中的原理及奥秘. 本篇主要是Kotaem ...