使用 xUnit 编写 ASP.NET Core WebAPI单元测试
本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程:
一、创建示例项目

模板为我们自动创建了一个ValuesController控制器,保留里面的一个Get请求和Post请求方法,代码如下:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return $"value:{id}";
}
// POST api/values
[HttpPost]
public ActionResult<string> Post(dynamic obj)
{
return $"姓名:{obj.Name},年龄:{obj.Age}";
}
}
使用.NET Core创建一个xUnit单元测试项目,如图:

项目的模板页已经为我们添加好了xUnit的引用,不需要我们手动去NuGet导入了,现在从NuGet中添加Microsoft.AspNetCore.App和Microsoft.AspNetCore.TestHost,xUnit项目并添加WebAPI的项目引用,如下图所示:

二、编写单元用例
写单元测试一般有三个步骤:Arrange,Act 和 Assert。
- Arrange 是准备阶段,这个阶段是准备工作,比如模拟数据、初始化对象等;
- Act 是行为阶段,这个阶段是用准备好的数据去调用要测试的方法;
- Assert 是断定阶段,就是把调用目标方法返回的值和预期的值进行比较,如果和预期一致说明测试通过,否则为失败。
新建一个单元测试类:ValuesTest.cs;用于对ValuesController进行单元测试。
1、使用HttpClient进行Get请求测试,单元测试代码如下:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Newtonsoft.Json;
using System.Net;
using System.Net.Http;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions; namespace WebAPI.xUnit
{
public class ValuesTests
{
public ValuesTests(ITestOutputHelper outputHelper)
{
var server = new TestServer(WebHost.CreateDefaultBuilder()
.UseStartup<Startup>());
Client = server.CreateClient();
} public HttpClient Client { get; } [Fact]
public async Task GetById_ShouldBe_Ok()
{
// Arrange
var id = ; // Act
var response = await Client.GetAsync($"/api/values/{id}"); // Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
}
这里我们通过 TestServer 拿到一个 HttpClient 对象,用它我们可以模拟 Http 请求。我们写了一个非常简单的测试用例,完整演示了单元测试的 Arrange,Act 和 Assert 三个步骤。
2、使用HttpClient进行Post请求测试,并用ITestOutputHelper输出请求信息,单元测试代码如下:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Newtonsoft.Json;
using System.Net;
using System.Net.Http;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions; namespace WebAPI.xUnit
{
public class ValuesTests
{
public ValuesTests(ITestOutputHelper outputHelper)
{
var server = new TestServer(WebHost.CreateDefaultBuilder()
.UseStartup<Startup>());
Client = server.CreateClient();
Output = outputHelper;
} public HttpClient Client { get; }
public ITestOutputHelper Output { get; } [Fact]
public async Task Post_ShouldBe_OK()
{
var content = new StringContent(JsonConvert.SerializeObject(new { Name = "cxt", Age = }), Encoding.UTF8, MediaTypeNames.Application.Json); var response = await Client.PostAsync("/api/values", content); // Output
var responseTest = await response.Content.ReadAsStringAsync(); Output.WriteLine(responseTest); Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
}
3、运行测试用例,得到测试结果。
在当前的方法内,如GetById_ShouldBe_Ok()、Post_ShouldBe_OK()代码块内右键->运行测试,或者打开测试资源管理器,运行所选测试

绿色的勾表示已经测试通过。
下面查看Post请求的Output打印结果:

通过上面两个测试用例,发现使用起来超级方便。
使用 xUnit 编写 ASP.NET Core WebAPI单元测试的更多相关文章
- 使用 xUnit 编写 ASP.NET Core 单元测试
还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层做单元测试简直就是灾难啊..NET Core 吸取教训,在设计上考虑到了可测试性,就连 ASP ...
- 使用xunit对asp.net core webapi进行集成测试
新项目我们采用前后端分离,后端采用asp.net core webapi, 如何对后端代码进行自动化测试呢,有以下几种方案: 1. 单元测试,目前这个方案对我们来说难度很大,抛开时间的问题,单元测试对 ...
- asp.net core webapi/website+Azure DevOps+GitHub+Docker
asp.net core webapi/website+Azure DevOps+GitHub+Docker 新春开篇作,主要写一下关于asp.net core web/api 2.2 项目借助dev ...
- asp.net core WebAPI学习以及 发布(***入门学习)
A asp.net Core 系列[一]——创建Web应用 asp.net Core 系列[二]—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API a ...
- Asp.Net Core WebAPI+PostgreSQL部署在Docker中
PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像, ...
- Keycloak & Asp.net core webapi 整合跳坑之旅
前言 之前,一直使用IdentityServer4作为.net core程序的外部身份认证程序,ID4的优点自不必说了,缺点就是缺乏完善的管理界面. 后来,学习java quarkus框架时,偶然遇到 ...
- ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码
概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...
- ASP.NET Core WebApi返回结果统一包装实践
前言 近期在重新搭建一套基于ASP.NET Core WebAPI的框架,这其中确实带来了不少的收获,毕竟当你想搭建一套框架的时候,你总会不自觉的去想,如何让这套框架变得更完善一点更好用一点.其中在关 ...
随机推荐
- ajax异步请求该嵌套还是并列?
因为要查询两个数据库表才能确定我所需要的数据范围,所以前台js得发两次ajax请求.问题就是,这两个请求是嵌套着写:{发,接{发,接}}:还是并列着写:{发,接},{发,接} 好? 答案:如果2次aj ...
- [ES]ES集群内容灾
ES是如何实现节点容灾的? 1. ES中的index,首先会进行分片,每一个分片数据一般都会有自己的副本数据,ES分配分片的策略会保证同一个分片数据和自己的副本不会分配到同一个节点上2. 当集群中的某 ...
- java进行3DES加解密
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...
- java ajax请求后台并获取到返回值
js: $.ajax({ url : '../Islogin.do', type : 'get', cache : false, dataType : 'json', success : functi ...
- HBuilder中ios打包
参考:http://ask.dcloud.net.cn/article/152 在ios端钥匙串双击(教程上是双击)导入证书时候,可能会报错,直接把证书文件拖入到keychain的登录里就解决了. 1 ...
- 第一个C#语言
第一个C#程序 .NET和C#的区别 1. C#只是.NET的一部分,.NET不止包含C# 2. C#是一种程序语言,.NET是一个平台.框架 IDE环境:vs 2012 VS2012的窗口结构 ...
- python学习 day6 (3月7日)
#__author : 'liuyang' #date : 2019/3/7 0007 a = ['a' , 'b' , 'c'] b = [] print(a is b ) # 空元组 可以 空列表 ...
- 【转】mysql查看表空间占用情况
${database} 为数据库的名称 /*1.查看索引 (1)单位是GB*/ SELECT CONCAT(ROUND(SUM(index_length)/(**), ), ' GB') AS 'To ...
- 【转】linux 磁盘挂载
挂载好新硬盘后输入fdisk -l命令看当前磁盘信息 可以看到除了当前的第一块硬盘外还有一块sdb的第二块硬盘,然后用fdisk /dev/sdb 进行分区 进入fdisk命令,输入h可以看到该命令的 ...
- oracle 大量连接导致数据库不能登录
系统遇到过几次这种问题,一个系统申请的session数过大,导致数据库进程数满,无法连接的问题. pl sql develope 报的错误是:ORA-12170:TNS:链接超时 oracle用户登录 ...