.NET使用Moq开源模拟库简化单元测试

news/2025/1/24 11:06:15/文章来源:https://www.cnblogs.com/Can-daydayup/p/18509437

前言

今天大姚给大家推荐一个.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支持💖。

  • 开源地址:https://github.com/devlooped/moq
  • MoqExercise:https://github.com/YSGStudyHards/DotNetExercises/tree/master/MoqExercise

优秀项目和框架精选

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

  • GitHub开源地址:https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
  • Gitee开源地址:https://gitee.com/ysgdaydayup/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

DotNetGuide技术社区

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/823058.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Global Round 27 div1+2 个人题解(A~E)

Codeforces Global Round 27 div1+2 个人题解(A~E) Dashboard - Codeforces Global Round 27 - Codeforces 火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <algorithm> #include <array> #include <bitset> #include <cassert> #include <cmat…

2024.10.22(周二)

[实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。…

实验3 c语言函数应用编程

task1:1 #include<stdio.h>2 3 char score_to_grade(int score);4 5 int main() {6 int score;7 char grade;8 9 while (scanf_s("%d",&score) != EOF) { 10 grade = score_to_grade(score); 11 printf("分数:%d,等级:%c…

JMeter JMeter-pugin-rabbitMQ消息发布插件

开发环境 RabbitMQ 3.9.16 Erlang 23.3.4.11 Apache-jmeter-5.3 Apache Maven 3.5.4 JDK 1.8.0_121 插件下载地址 https://gitee.com/ishouke/jmeter-plugin-rabbitmq/tree/master 插件使用方法 插件配置 将插件及依赖类库目录下的所有.jar 文件放到 %JMETER_HOME\lib\ext目录…

读数据工程之道:设计和构建健壮的数据系统22获取阶段考虑因素

获取阶段考虑因素1. 有边界与无边界数据 1.1. 无边界数据是现实中存在的数据,是事件发生时的数据,要么是间断的,要么是连续的、持续的和流动的 1.2. 有边界数据是跨越某种边界(如时间)对数据进行归类的一种便捷方式1.2.1. 所有的数据在有边界之前都是无边界的1.3. 长期以来…

mobian trixie 安装 docker

手机刷了 mobian 想安装 docker,记录安装过程中的一些问题 1. 更新软件包列表 sudo apt-get update2. 安装依赖包 sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release3. 添加 Docker 的官方GPG密钥 curl -fsSL https://download.docker.com/linux/…

龙哥盟-PMP-课程笔记-三-

龙哥盟 PMP 课程笔记(三) 2024PMP认证考试课程(第六版+敏捷+第七版) - P6:2.1-2.3 组织过程资产 - 慧翔天地PMP课堂 - BV1By411b7qM 运行环境阶段的课程吧。轻松加愉快,基本上听一听,没什么需要去背的东西,就这么三大块,事业环境因素和组织过程资产,然后呢说了一个组…

龙哥盟-PMP-课程笔记-十九-

龙哥盟 PMP 课程笔记(十九) 【2023敏捷认证】全新PMP考试ACP敏捷知识点精讲视频教程! - P8:06敏捷实施:在敏捷环境中交付 - PMP项目管理那些事 - BV1oP411S7xp 好,那么下面呢我们来讲一下啊,这个在敏捷环境当中的如何去交付啊。呃,那么先前的话我们也是呃讲到呢,在实施…

龙哥盟-PMP-课程笔记-四-

龙哥盟 PMP 课程笔记(四) 2024年PMP认证考试课程针对PMP新考纲最新免费零基础也能轻松听懂 - P4:PMP第4章:项目整合管理(上) - 乐凯咨询 - BV1Rj411G7gs 好各位同学晚上好,今天晚上我们一起来开始学习第四章,项目整合管理好吧,那么我们今天晚上呢,就讲项目整合管理的…

FAST-DDS源码阅读笔记(二)-DDS层

eProsima Fast DDS 提供了两种不同的API,以在不同层面上与通信服务进行交互。 主要的API是数据分发服务(DDS)数据中心化发布/订阅(DCPS)平台无关模型(PIM)API,或者简称为DDS DCPS PIM,它是由DDS 1.4规范定义的,Fast DDS 遵循该规范,由Core,Domain,Publisher,Subs…

【CodeForces训练记录】Codeforces Global Round 27

训练情况赛后反思 guessforces?结论全靠猜?逆天C题构造+大力分类讨论,这谁想得到啊? A题 我们看 \((r,c)\) 所在的行,其右边的球左移,对答案的贡献为 \(m-c\),接下来再看下面的 \(n-r\) 行的最左边的球,每个球移动到右上角对答案的贡献为 \(m\),接下来就是剩下的球往左…