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

前言

今天大姚给大家推荐一个.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技术社区微信交流群👪

相关推荐
追逐时光者16 小时前
.NET使用Umbraco CMS快速构建一个属于自己的内容管理系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者2 天前
一个.NET开源、快速、功能丰富的跨平台阅读服务器
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者3 天前
一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者5 天前
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者6 天前
使用Microsoft.Extensions.AI简化.NET中的AI集成
【.net】·【c#】·【开源项目】·【.net core】·【aigc】
追逐时光者7 天前
基于C#开源、功能强大、灵活的跨平台开发框架 - Uno Platform
【.net】·【c#】·【开源项目】·【.net core】
追逐时光者8 天前
利用腾讯元器,将公众号变身为强大的.NET AI智能体
【.net】·【c#】·【ai编程】·【.net core】·【aigc】
追逐时光者9 天前
.NET现在可以做什么,有哪些公司在用的?
【.net】·【c#】·【.net core】
追逐时光者11 天前
推荐7款程序员常用的API管理工具
【开源项目】·【实用工具】
追逐时光者11 天前
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
【.net】·【c#】·【.net core】·【技术前沿周刊】