【C#/.NET】xUnit和Moq实现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#/.NET】xUnit和Moq实现TDD的更多相关文章
- 在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet
最近在做一个项目的单元测试时,遇到了些问题,解决后,觉得有必要记下来,并分享给需要的人,先简单说一下项目技术框架背景: asp.net core 2.0(for .net core)框架 用Entit ...
- TDD in .NET Core - 简介
本文很多内容来自选自TDD实例一书. 预备知识 最好有一些预备知识,例如xUnit,Moq,如何编写易于测试的代码,这些内容我都写了文章:https://www.cnblogs.com/cgzl/p/ ...
- 模拟测试—moq:简单一两句
在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...
- DotNet 资源大全中文版
https://blog.csdn.net/fhzh520/article/details/52637545 目录 算法与数据结构(Algorithms and Data structures) 应用 ...
- ASP.NET 系列:单元测试
单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试
本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容, ...
- Net Core WebApi单元测试
单元测试 本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json ...
- 这样入门asp.net core,如何
本文章主要说明asp.net core的创建和简单使用. 一.使用到的命令 dotnet new :创建项目(解决方案,类库,单元测试等),如:dotnet new web dotnet add pa ...
- 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它
本文介绍如何保护API,无需看前边文章也能明白吧. 预备知识: http://www.cnblogs.com/cgzl/p/9010978.html http://www.cnblogs.com/cg ...
- 测试 ASP.NET Core API Controller
本文需要您了解ASP.NET Core MVC/Web API, xUnit以及Moq相关知识. 这里有xUnit和Moq的介绍: https://www.cnblogs.com/cgzl/p/917 ...
随机推荐
- 念一句咒语 AI 就帮我写一个应用,我人麻了...
原文链接:https://forum.laf.run/d/232 作为人类,我们时常会有自己独特的想法和脑洞大开的创意.然而,这些想法往往因为成本过高而无法实现,毕竟每个人的能力和精力都是有限的,尤其 ...
- MySQL--索引的数据结构
1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页面,便可以快速定位到需要的文章,mysql中也是一样的道理,进行数据查找时, ...
- Linux(一)Linux简介、目录结构、网络配置与系统服务
1 Linux简介 Linux基于Unix,是多用户分时系统 Ctrl + Alt + F2.F3...F6打开多个Linux Shell终端控制器:F1为图形化界面,终端为仿真器 2 Linux文件 ...
- 基于Python的爬虫案例
案例1:使用爬虫爬取京东华为手机用户评论 本案例借鉴哔哩哔哩博客主视频教程,感谢其教程为我开启了爬虫之旅:https://www.bilibili.com/video/BV1Yt4y1Y7nt?t=3 ...
- 关于Validation的方法使用
acceptance验证 acceptance 是 Rails 中的一个验证器(validator),用于验证一个布尔类型的属性是否被接受.在表单中,通常会有一些复选框或单选按钮,用户需要勾选或选择才 ...
- Eclipse中添加Shell脚本(如start.sh)
Eclipse中添加Shell脚本(如start.sh) 使用eclipse时,我们有时候会在自己的工程文件下添加一些脚本(比如将Qt代码在eclipse中运行生成moc文件时,或者要拷贝 ...
- 想打印k8s资源YAML结果搞懂了Client-Side & Server-Side Apply
前言 由于查看k8s资源YAML时常看到沉长的YAML与手写的格式,相差甚远不利于阅读,经过探索官方文档,才理解什么是Client-Side & Server-Side Apply. 先看一下 ...
- .NET Core 波场链离线签名、广播交易(发送 TRX和USDT)笔记
Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. ...
- 文心一言 VS chatgpt (12)-- 算法导论3.1 6~7题
六.证明:一个算法的运行时间为θ(g(n))当且仅当其最坏情况运行时间为O(g(n)),且其最好情况运行时间为Ω(g(n)) . 文心一言: chatgpt: 要证明「一个算法的运行时间为θ(g(n) ...
- Hugging News #0512: 🤗 Transformers、🧨 Diffusers 更新,AI 游戏是下个新热点吗
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...