《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 ...
随机推荐
- POJ
//poj 2080//题目大意:给定天数,从2000年1月1日经过这些天后的 年 月 日 及 星期几//代码参照大牛的写的,本人还是处于菜鸟阶段,思路很好#include<stdio.h> ...
- 域名解析类型及dig,nslookup进行Dns解析过程查看
本文为博主原创,未经允许不得转载: 通常我们在windows系统下查看域名是不是可以正常访问,是通过cmd命令打开dos窗口,使用ping 命令来查看域名是不是可以正常访问,使用 ping 命令正常访 ...
- 基于java+springboot的旅游信息网站、旅游景区门票管理系统
该系统是基于java+springboot开发的旅游景区门票管理系统.是给师弟开发的大四实习作品.学习过程中,遇到问题可以咨询github作者. 演示地址 前台地址: http://travel.gi ...
- Vue之使用elementUI的upload上传组件导入csv文件
最近干活的时候有个需求,需要将csv文件导入到mysql数据库中,前后端框架用的springboot+Vue,组件用的elementUI,下面将分步骤记录实现过程. 1.导入按钮部分: <el- ...
- Angular系列教程之生命周期钩子
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- [java] - 获取上传到服务器上的文件路径
request.getSession().getServletContext().getRealPath("upload/" );
- linux环境C语言实现:h264与pcm封装成AVI格式
前言 拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题. RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视 ...
- [转帖]MySQL的版本情况
Introducing MySQL Innovation and Long-Term Support (LTS) versions (oracle.com) Introducing MySQL Inn ...
- SQLServer Core 序列号使用CPU限制的处理
SQLServer Core 序列号使用CPU限制的处理 背景 有客户是SQLSERVER的数据库. 说要进行一下压测. 这边趁着最后进行一下环境的基础搭建工作. 然后在全闪的环境上面搭建了一个Win ...
- [转帖]Prometheus监控系统存储容量优化攻略,让你的数据安心保存!
云原生监控领域不可撼动,Prometheus 是不是就没缺点?显然不是. 一个软件如果什么问题都想解决,就会导致什么问题都解决不好.所以Prometheus 也存在不足,广受诟病的问题就是 单机存储不 ...