目录

前置条件

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#/.NET】xUnit和Moq实现TDD的更多相关文章

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

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

  2. TDD in .NET Core - 简介

    本文很多内容来自选自TDD实例一书. 预备知识 最好有一些预备知识,例如xUnit,Moq,如何编写易于测试的代码,这些内容我都写了文章:https://www.cnblogs.com/cgzl/p/ ...

  3. 模拟测试—moq:简单一两句

    在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...

  4. DotNet 资源大全中文版

    https://blog.csdn.net/fhzh520/article/details/52637545 目录 算法与数据结构(Algorithms and Data structures) 应用 ...

  5. ASP.NET 系列:单元测试

    单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...

  6. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(九)-- 单元测试

    本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json 文件内容, ...

  7. Net Core WebApi单元测试

    单元测试 本篇将结合这个系列的例子的基础上演示在Asp.Net Core里如何使用XUnit结合Moq进行单元测试,同时对整个项目进行集成测试. 第一部分.XUnit 修改 Project.json  ...

  8. 这样入门asp.net core,如何

    本文章主要说明asp.net core的创建和简单使用. 一.使用到的命令 dotnet new :创建项目(解决方案,类库,单元测试等),如:dotnet new web dotnet add pa ...

  9. 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

    本文介绍如何保护API,无需看前边文章也能明白吧. 预备知识: http://www.cnblogs.com/cgzl/p/9010978.html http://www.cnblogs.com/cg ...

  10. 测试 ASP.NET Core API Controller

    本文需要您了解ASP.NET Core MVC/Web API, xUnit以及Moq相关知识. 这里有xUnit和Moq的介绍: https://www.cnblogs.com/cgzl/p/917 ...

随机推荐

  1. 我的合肥 .NET 俱乐部线下活动之旅

    一:背景 我是一个性格比较内向的人,天然抵触这种线下面对面的大型活动,我害怕上台之后紧张到语无伦次(有过类似经历),越语无伦次又会让我更紧张,刚好谋得程序员这种工作又特别适合我这种性格的人,所以没有刻 ...

  2. 【小白晋级大师】如何设计一个支持10万人用的ChatGPT对接系统

    不停地书写,方能不失在人海茫茫. 1.前言 之前给大家写了ChatGPT对接企业微信的教程,具体可看知乎链接: [奶奶看了都会]ChatGPT3.5接入企业微信,可连续对话 文章结尾说了教程只能适用于 ...

  3. 二进制安装Kubernetes(k8s) v1.23.6

    二进制安装Kubernetes(k8s) v1.23.6 背景 kubernetes二进制安装 1.23.3 和 1.23.4 和 1.23.5 和 1.23.6 文档以及安装包已生成. 后续尽可能第 ...

  4. 安全测试前置实践1-白盒&黑盒扫描

    作者:京东物流 陈维 一.引言 G.J.Myers在<软件测试的艺术>中提出:从心理学角度来说,测试是一个为了寻找错误而运行程序的过程. 那么安全测试则是一个寻找系统潜在安全问题的过程,通 ...

  5. 使用CodeArts发布OBS,函数工作流刷新CDN缓存

    摘要:上次通过OBS和CDN部署来Hexo网站,但是每次我们不可能都自己编译然后在上传到OBS,不然太麻烦了,所以我们需要构建流水线,通过PUSH Markdown来发布文章. 本文分享自华为云社区& ...

  6. 香,一套逻辑轻松且智能解决PyQt中控件数值验证的问题

    在PyQt开发中,时常需要对控件的值进行校验,如需要校验QCheckBox是否被选中,QLabel是否校验值是否为空等等.在复杂的业务场景下,这类控件如果数量很多,逐个校验就显得麻烦,需要一一获得控件 ...

  7. Cmder: 懒癌必备!从此告别记事本记命令的日子

    前言 平时开发中遇到这样那样的命令需要记下来,一般做法是这样. 新建记事本 将需要记下的关键命令保存. 每次需要使用时,粘贴复制即可. 好像没什么毛病!直到遇到了 Cmder... 当看到同事分析问题 ...

  8. html/css 添加图片

    通过img.src添加图片 添加一个img元素,设置content,会发现在IE.safari等浏览器内显示为空白. 一般我们使用img,是通过src来设置的,可以通过react的import图片添加 ...

  9. 从原理到应用,人人都懂的ChatGPT指南

    作者:京东科技 何雨航 引言 如何充分发挥ChatGPT潜能,已是众多企业关注的焦点.但是,这种变化对员工来说未必是好事情.IBM计划用AI替代7800个工作岗位,游戏公司使用MidJourney削减 ...

  10. 2022-10-18:以下go语言代码输出什么?A:panic;B:编译错误;C:moonfdd1。 package main import ( “fmt“ “net/url“ ) // 其中

    2022-10-18:以下go语言代码输出什么?A:panic:B:编译错误:C:moonfdd1. package main import ( "fmt" "net/u ...