首页 > 编程语言 >【C#/.NET】xUnit和Moq实现TDD

【C#/.NET】xUnit和Moq实现TDD

时间:2023-06-15 12:22:26浏览次数:37  
标签:C# Calculator Moq 单元测试 TDD xUnit 代码

 目录

 

前置条件

Moq

xUnit

TDD

实践

创建项目

红灯

绿灯

重构

单元测试一些最佳实践

总结


 

前置条件

Moq

安装Moq包

Install-Package Moq

 

        Moq是一个Mocking库,通过它可以轻易地模拟对象来进行测试。在我们的例子中,我们将使用Moq来模拟一个数据库访问类。

 

xUnit

        xUnit是一个基于.NET平台的测试框架。它提供了各种测试机制,例如类、测试函数、断言等等。在我们的例子中,我们将使用xUnit来编写C#代码的测试用例。

 

TDD

        测试驱动开发 (TDD) 是一种软件开发过程或方法,开发人员基本上通过单元测试开始创建软件——与传统方法不同,传统方法是开发软件,最后才创建测试用例以确保成功实施.

TDD的三个步骤是红绿重构

  • 红灯指的是先编写单元测试,此时还没有写任何具体实现代码,所以单元测试编译都通不过。
  • 绿灯指根据编写的单元测试,实现代码,目标是刚好可以让测试通过。
  • 重构是指的在保证了实现的代码可以通过单元测试,有了单元测试的保障之后,重构代码。重复上述的三个红绿重构步骤。

 

实践

创建项目

dotnet new sln -n Tdd

dotnet new console -o src/Calculator

dotnet new xunit -o test/Calculator.Tests

dotnet sln add src/Calculator

dotnet sln add test/Calculator.Tests

 

红灯

        由于TDD是测试先行,此次我们模拟开发一个简单的计算器。所以先写单元测试。

using Moq;

namespace Calculator.Tests;

public class CalculatorTests
{
    [Fact]
    public void Calculate_WhenCalled_ReturnsNumber()
    {
        Mock<ICalculator> calculatorMock = new();
        var num1 = It.IsAny<int>();
        var num2 = It.IsAny<int>();
        var res = It.IsAny<int>();
        calculatorMock.Setup(c => c.Calculate(num1, num2)).Returns(res);

        var result = calculatorMock.Object.Calculate(num1, num2);

        Assert.Equal(res, result);
    }
}

 

        测试方法先准备了三个参数,使用了Moq的It.IsAny<>()方法,这个方法可以方便的创建一个对象。然后是Mock<>泛型方法用来模拟接口,通过Setup设置模拟的接口的参数传什么,返回什么结果。

        最后访问了calculatorMock对象的Object,相当于是模拟的ICalculator对象。

        单元测试编写完之后,是一片红,无法编译的。因为目前没有具体实现代码。所以我们完成了TDD的第一步,红灯。

绿灯

        TDD的第二步,绿灯,我们需要根据现有的单元测试,实现代码。让单元测试能够通过。

首先是定义一个ICalculator接口,还有Calculate方法

namespace Calculator;

public interface ICalculator
{
    int Calculate(int num1, int num2);
}

 

        运行单元测试,发现可以通过。此时已经完成了第二步,绿灯。

重构

        由于本文只是介绍TDD,不涉及复杂的逻辑。重构环节根据具体的业务逻辑实现就好了。

 

单元测试一些最佳实践

  • 命名遵循  测试方法名_测试方案_预期行为
  • 测试代码避免逻辑,如if,while,for和switch
  • 避免将Mock对象当作字段在整个单元测试方法都依赖,因为这样可能对具体一个Mock对象有状态依赖

 

总结

        在本文中,我们介绍了如何使用xUnit和Moq库实现TDD。通过编写测试代码并在功能代码之前运行它,我们能够快速发现程序中的错误,并提高代码质量。xUnit提供了各种测试机制,如类、测试函数、断言等,Moq库提供了轻松模拟对象的机制。如果您正在寻找一个快速、简单、可靠的开发方法来编写高质量的代码,请尝试TDD。

 

 

标签:C#,Calculator,Moq,单元测试,TDD,xUnit,代码
From: https://www.cnblogs.com/xuyd/p/17482529.html

相关文章

  • 第八章--FusionCharts Free和组合图XML
    时间:2009-01-1222:23      作者:道长AIEQQ百度POCOYahoo新浪365Key天极和讯博拉Live奇客鲜果收客饭否叽歪  xAxisName='Month' showValues='0' de......
  • systemctl强大服务2
         systemd是按照单元(unit)来管理系统的,一共有12种单元的类型,上面讨论涉及到的service也是单元的类型之一:主要的单元有以下的如示:单元说明service启动和守护进程target单元组socket从套接字接收信息启动服务device设备检测以启动服务mount挂载文件系统outmount自动挂载......
  • 利用JXL(JExcelApi) 操作Excel文档
    http://coderdream.javaeye.com/blog/2506281、工具类:Java代码1.packagecom.coderdream.jxl;2.3.importjava.io.File;4.importjava.io.IOException;5.6.importjxl.Cell;7.importjxl.Sheet;8.import......
  • 如何从CLI管理阿里巴巴MySQL数据库
    阿里云提供高度可用的按需MySQL,SQLServer和PostgreSQL数据库,作为其ApsaraDBforRDS  (关系数据库服务)的一部分。RDS易于设置和部署。该服务处理数据库服务器的所有管理任务,包括在发生灾难时进行配置,修补和恢复。除了这个即用型数据库服务,您还可以选择从弹性计算服务(ECS)实例设置......
  • 华为认证 | HCIE-云计算 考试大纲
    上次更新了HCIP的Datacom考纲,好多小伙伴来询问云计算HCIE的相关内容,先安排上!还想看什么方向的考纲,私信我,发送暗号「考纲」,我直接给你发更详细的内容哈!01华为云计算HCIE技术华为云计算HCIE培训定位国内外大中型云数据中心的规划、设计、操作、部署以及运维优化。设计内容包含不限于......
  • 融云 CTO 岑裕受邀出席亚马逊云科技「出海日」论坛
    6月9 日,亚马逊云科技主办的“潮向新世界”出海日活动在深圳举行,融云作为领军出海服务企业受邀出席。关注【融云全球互联网通信云】了解更多在现场展位,融云的一站式全生态出海解决方案备受关注;在论坛环节,融云CTO岑裕带来《社交泛娱乐App出海的技术探索之路》主旨发言,并介绍了......
  • MEF.postman_collection.json
    { "info":{ "_postman_id":"c41bc34c-dec8-4270-b3a4-e9a53b36c705", "name":"MEF", "schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json" }, "item......
  • 关于 mipi cphy 与 dphy 的理解
    客户提出问题:需要cphy的mipi的显示。由于对cphy与dphy不是很了解,查了一些资料。网上的资料。    好了,接下来看看3588核心板原理图。   来说一下自己的理解: mipiD/Cphyport0/1,这个phy, 这个phy有两个port,port是什么意思不知道,对于 ......
  • container scale up/ down 原理 in kubernetes
    https://imroc.cc/kubernetes/best-practices/autoscaling/hpa-velocity.html 原理与误区HPA在进行扩缩容时,先是由固定的算法计算出期望副本数: 期望副本数=ceil[当前副本数*(当前指标/期望指标)]其中 当前指标/期望指标 的比例如果接近1(在容忍度范围内,默......
  • JavaScript内存限制
    JavaScriptmemorylimitJavaScript应用程序可以存储的最大数据量是多少?我猜这是由浏览器处理的,每个浏览器都有其局限性吗?如果没有限制,将创建页面文件吗?如果是这样,那不安全吗? 相关讨论  有一些限制,尽管这些取决于浏览器。例如,Firefox对堆栈空间以及过多的CPU消......