《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(上)
第 9 章 测试和文档
9.1 测试
测试是软件生命周期中的一个非常重要的阶段,对于保证软件的可靠性具有极其重要的意义
常见的测试方法有很多,根据不同的维度,可以把测试方法分为不同的类别
从观察结构的透明性方式上,分为白盒测试、黑盒测试和灰盒测试
从测试执行方式上,分为手动测试和自动化测试
从测试所涉及的层次上,分为单元测试、集成测试和系统测试
单元测试由开发人员完成,主要用来测试程序中的类以及其中的方法是否能够正确运行
在添加单元测试方法时,应遵循 Arrange-Act-Access 模式,使测试方法的代码更加规范,该模式指明了每个测试方法由以下3部分组成:
- Arrange:为测试进行准备操作,如设置测试数据、变量和环境等
- Act:执行要测的方法,如调用要测试的函数和方法
- Assert:断言测试结果,验证被测试方法的输出是否与预期的结果一致
我们使用 xUnit 测试框架,为项目命名为 Library.API.Testing
项目创建完成后,将默认的 UnitTest1.cs 删除,并添加一个新类,名为 AuthorController_UnitTests,该类主要包含针对 AuthorController 中方法的测试方法
由于 AuthorController 的构造函数中引用了多个其他依赖项,如 IRepositoryWrapper 和 IMapper 等,可以使用 Moq 库来模拟
namespace Library.API.Testing
{
public class AuthorController_UnitTests
{
private AuthorController _authorController;
private Mock<IDistributedCache> _mockDistributedCache;
private Mock<ILogger<AuthorController>> _mockLogger;
private Mock<IMapper> _mockMapper;
private Mock<IRepositoryWrapper> _mockRepositoryWrapper;
private Mock<IUrlHelper> _mockUrlHelper;
public AuthorController_UnitTests()
{
_mockRepositoryWrapper = new Mock<IRepositoryWrapper>();
_mockMapper = new Mock<IMapper>();
_mockLogger = new Mock<ILogger<AuthorController>>();
_mockDistributedCache = new Mock<IDistributedCache>();
_mockUrlHelper = new Mock<IUrlHelper>();
_authorController = new AuthorController(_mockMapper.Object,
_mockRepositoryWrapper.Object,
_mockLogger.Object,
_mockDistributedCache.Object);
_authorController.ControllerContext = new ControllerContext
{
HttpContext = new DefaultHttpContext()
};
}
}
}
在 AuthorController 中用到了 Response 属性,该属性可以控制 HTTP 响应,如在 GetAuthorsAsync 方法中使用它为响应添加了自定义消息头
Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetedata));
已实例化的 AuthorController 的 Response 属性默认为空,通过设置 ControllerContext,使得 AuthorController 对象的 Request 和 Response 属性将不再为空
接下来对 GetAuthorsAsync 添加测试方法
[Fact]
public async Task Test_GetAuthorsAsync()
{
// Arrange
var author = new Author
{
Id = Guid.NewGuid(),
Name = "Author Test 1",
Email = "author1@xxx.com"
};
var authorDto = new AuthorDto
{
Id = author.Id,
Name = author.Name,
Email = author.Email,
};
var authorList = new List<Author> {author};
var authorDtoList = new List<AuthorDto> {authorDto};
var parameters = new AuthorResourceParameters();
var authors = new PagedList<Author>(authorList, totalCount: authorList.Count,
pageNumber: parameters.PageNumber, pageSize: parameters.PageSize);
_mockRepositoryWrapper.Setup(m => m.Author.GetAllAsync(It.IsAny<AuthorResourceParameters>()))
.Returns(Task.FromResult(authors));
_mockMapper.Setup(m => m.Map<IEnumerable<AuthorDto>>(It.IsAny<IEnumerable<Author>>()))
.Returns(authorDtoList);
_mockUrlHelper.Setup(m => m.Link(It.IsAny<string>(), It.IsAny<object>())).Returns("demo url");
_authorController.Url = _mockUrlHelper.Object;
// Act
var actionResult = await _authorController.GetAuthorsAsync(parameters);
// Assert
List<AuthorDto> resourceCollection = actionResult.Value;
Assert.True(1==resourceCollection.Count);
Assert.Equal(authorDto,resourceCollection.First());
Assert.True(_authorController.Response.Headers.ContainsKey("X-Pagination"));
}
上面的测试方法遵循了 Arrange-Act-Assert 的模式
当数据准备好后,调用待测试的方法,并得到该方法的返回值,之后使用 Assert 类提供的静态方法来验证结果是否符合预期


本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。
《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(上)的更多相关文章
- 使用ASP.NET Core构建RESTful API的技术指南
译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...
- 4类Storage方案(AS开发实战第四章学习笔记)
4.1 共享参数SharedPreferences SharedPreferences按照key-value对的方式把数据保存在配置文件中,该配置文件符合XML规范,文件路径是/data/data/应 ...
- 菜单Menu(AS开发实战第四章学习笔记)
4.5 菜单Menu Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发.页面的布局文件放在re ...
- [Android]《Android艺术开发探索》第一章读书笔记
1. 典型情况下生命周期分析 (1)一般情况下,当当前Activity从不可见重新变为可见状态时,onRestart方法就会被调用. (2)当用户打开新的Activity或者切换到桌面的时候,回调如下 ...
- 温故知新,使用ASP.NET Core创建Web API,永远第一次
ASP.NET Core简介 ASP.NET Core是一个跨平台的高性能开源框架,用于生成启用云且连接Internet的新式应用. 使用ASP.NET Core,您可以: 生成Web应用和服务.物联 ...
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...
- 零基础ASP.NET Core WebAPI团队协作开发
零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
- 从 0 使用 SpringBoot MyBatis MySQL Redis Elasticsearch打造企业级 RESTful API 项目实战
大家好!这是一门付费视频课程.新课优惠价 699 元,折合每小时 9 元左右,需要朋友的联系爱学啊客服 QQ:3469271680:我们每课程是明码标价的,因为如果售价为现在的 2 倍,然后打 5 折 ...
- Asp.Net Core 5 REST API - Step by Step
翻译自 Mohamad Lawand 2021年1月19日的文章 <Asp.Net Core 5 Rest API Step by Step> [1] 在本文中,我们将创建一个简单的 As ...
随机推荐
- C#语言 十大经典排序算法动画与解析!(动态演示+代码)(java改写成C# )
以下内容是根据 https://www.cnblogs.com/fivestudy/p/10212306.html 进行改写 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法 ...
- springBoot 整合 hikari
Hikari是一款非常强大,高效,并且号称"史上最快连接池".并且在springboot2.0之后,采用的默认数据库连接池就是Hikari.不需要引入依赖,已经在SpringBoo ...
- jenkins构建报错: Send build artifacts over SSH' changed build result to UNSTABLE
原因包括: ssh配置的用户没有相关的权限. 最好是配置root用户
- canal报错nosuchmethod ..bytebuffer
解决方法:更新jdk版本与es一致
- [转帖]七. PostgreSQL逻辑结构(1)—数据库和模式
https://www.jianshu.com/p/ee8b1bdfdb19 在PostgreSQL里,逻辑结构从高到底依次是:数据库.模式(又叫架构).表.行.当我们打开PostgreSQL官方自带 ...
- [转帖]编译安装goofys挂载Scaleway免费75G对象存储
日常•2022年5月29日 goofys编译 goofys是一个开源的使用Go编写的s3存储桶挂载工具,主打高性能.由于使用Go编写,没有用到什么特别的依赖,自己编译也很容易.截止2022.5.2 ...
- [转帖]kafka搭建kraft集群模式
kafka2.8之后不适用zookeeper进行leader选举,使用自己的controller进行选举 1.准备工作 准备三台服务器 192.168.3.110 192.168.3.111 192. ...
- [转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别
sudo 命令 1.sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等.这样不仅减少了root用户 ...
- [转帖]Linux 中unzip解压时中文乱码的解决办法
https://www.yii666.com/blog/163883.html Linux 中unzip解压时中文乱码的解决办法 当我们在linux中解压一个含有中文名字的压缩包如"资料.z ...
- [转帖]【redis】redis各稳定版本特性(更新到6.0版本)
1.Redis2.6 Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性如下: 1)服务端支持Lua脚本. 2)去掉虚拟内存相关功能. 3)放 ...