Abp vnext Web应用程序开发教程 4 —— 集成测试
文章目录
- 关于本教程
- 下载源代码
- 在解决方案中测试项目
- 添加测试数据
- 测试BookAppService
- 下一部分
关于本教程
本教程基于版本3.1
在本教程系列中,您将构建一个名为Acme.BookStore
的基于ABP的Web应用程序。该应用程序用于管理书籍及其作者的列表。它是使用以下技术开发的:
- 实体框架核心作为ORM提供者。
- MVC/Razor页面作为UI框架。
本教程分为以下部分:
第1部分:创建服务器端
第2部分:图书列表页面
第3部分:创建、更新和删除书籍
第4部分:集成测试(此部分)
第5部分:授权
第6部分:作者:领领域层
第7部分:作者:数据库集成
第8部分:作者:应用程序层
第9部分:作者:用户界面
第10部分:书与作者的关系
下载源代码
MVC (Razor Pages) UI with EF Core
在解决方案中测试项目
本部分介绍服务器端测试。解决方案中有几个测试项目:
每个项目都用于测试相关项目。测试项目使用以下库进行测试:
Xunit作为主要测试框架。
Shoudly作为断言库。
NSubstitute作为模拟库。
测试项目被配置为使用内存中的SQLite作为数据库。创建一个单独的数据库实例并播种(使用数据种子系统),为每个测试准备一个新的数据库。
添加测试数据
如果您已按照第一部分中的说明创建了数据种子贡献者,则相同的数据将在您的测试中可用。因此,您可以跳过此部分。如果尚未创建种子贡献者,则可以使用BookStoreTestDataSeedContributor
来为要在以下测试中使用的相同数据注入种子。
测试BookAppService
添加一个新的测试类,在Acme.BookStore.Application.Tests
项目的Books
命名控件(文件夹)中命名为BookAppService_Tests
:
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Xunit;namespace Acme.BookStore.Books
{ public class BookAppService_Tests : BookStoreApplicationTestBase{private readonly IBookAppService _bookAppService;public BookAppService_Tests(){_bookAppService = GetRequiredService<IBookAppService>();}[Fact]public async Task Should_Get_List_Of_Books(){//Actvar result = await _bookAppService.GetListAsync(new PagedAndSortedResultRequestDto());//Assertresult.TotalCount.ShouldBeGreaterThan(0);result.Items.ShouldContain(b => b.Name == "1984");}}
}
Should_Get_List_Of_Books
测试只是简单的使用BookAppService.GetListAsync
方法来获取和检查书籍列表。我们可以安全地检查“1984”这本书的名称,因为我们知道这本书已经存在于数据库中,因为我们已经将其添加到种子数据中。
将新的测试方法添加到创建新有效书的BookAppService_Tests
类中:
[Fact]
public async Task Should_Create_A_Valid_Book()
{//Actvar result = await _bookAppService.CreateAsync(new CreateUpdateBookDto{Name = "New test book 42",Price = 10,PublishDate = System.DateTime.Now,Type = BookType.ScienceFiction});//Assertresult.Id.ShouldNotBe(Guid.Empty);result.Name.ShouldBe("New test book 42");
}
添加一个尝试创建无效书籍并失败的新测试:
[Fact]
public async Task Should_Not_Create_A_Book_Without_Name()
{var exception = await Assert.ThrowsAsync<AbpValidationException>(async () =>{await _bookAppService.CreateAsync(new CreateUpdateBookDto{Name = "",Price = 10,PublishDate = DateTime.Now,Type = BookType.ScienceFiction});});exception.ValidationErrors.ShouldContain(err => err.MemberNames.Any(mem => mem == "Name"));
}
- 由于
Name
的值为空,因此ABP将抛出AbpValidationException
异常。
最终的测试类应如下所示:
using System;
using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Validation;
using Xunit;namespace Acme.BookStore.Books
{ public class BookAppService_Tests : BookStoreApplicationTestBase{private readonly IBookAppService _bookAppService;public BookAppService_Tests(){_bookAppService = GetRequiredService<IBookAppService>();}[Fact]public async Task Should_Get_List_Of_Books(){//Actvar result = await _bookAppService.GetListAsync(new PagedAndSortedResultRequestDto());//Assertresult.TotalCount.ShouldBeGreaterThan(0);result.Items.ShouldContain(b => b.Name == "1984");}[Fact]public async Task Should_Create_A_Valid_Book(){//Actvar result = await _bookAppService.CreateAsync(new CreateUpdateBookDto{Name = "New test book 42",Price = 10,PublishDate = System.DateTime.Now,Type = BookType.ScienceFiction});//Assertresult.Id.ShouldNotBe(Guid.Empty);result.Name.ShouldBe("New test book 42");}[Fact]public async Task Should_Not_Create_A_Book_Without_Name(){var exception = await Assert.ThrowsAsync<AbpValidationException>(async () =>{await _bookAppService.CreateAsync(new CreateUpdateBookDto{Name = "",Price = 10,PublishDate = DateTime.Now,Type = BookType.ScienceFiction});});exception.ValidationErrors.ShouldContain(err => err.MemberNames.Any(mem => mem == "Name"));}}
}
打开“测试资源管理器”窗口(如果看不到,请使用“测试”->“窗体”->“测试资源管理器”菜单),然后运行所有测试:
恭喜,绿色图标表示测试已成功通过!
下一部分
请参阅本教程的下一部分。
Abp vnext Web应用程序开发教程 4 —— 集成测试相关推荐
- Abp vnext Web应用程序开发教程 10 —— 书与作者的关系
文章目录 关于本教程 下载源代码 介绍 向书实体添加关系 数据库和数据迁移 更新EF核心映射 添加新的EF核心迁移 更改数据播种器 应用层 数据传输对象 IBookAppService BookApp ...
- Abp vnext Web应用程序开发教程 9 —— 作者:用户界面
文章目录 关于本教程 下载源代码 介绍 图书列表页面 Index.cshtml IndexModel.cshtml.cs Index.js 本地化 添加到主菜单 运行应用程序 创建模态 CreateM ...
- Abp vnext Web应用程序开发教程 8 —— 作者:应用程序层
文章目录 关于本教程 下载源代码 介绍 IAuthorAppService AuthorDto GetAuthorListDto CreateAuthorDto UpdateAuthorDto Aut ...
- Abp vnext Web应用程序开发教程 7 —— 作者:数据库集成
文章目录 关于本教程 下载源代码 介绍 数据库上下文 创建一个新的数据库迁移 实现IAuthorRepository 下一部分 关于本教程 本教程基于版本3.1 在本教程系列中,您将构建一个名为Acm ...
- Abp vnext Web应用程序开发教程 6 —— 作者:领域层
文章目录 关于本教程 下载源代码 介绍 作者实体 AuthorManager:领域服务 IAuthorRepository 结论 下一部分 关于本教程 本教程基于版本3.1 在本教程系列中,您将构建一 ...
- Abp vnext Web应用程序开发教程 3 —— 创建、更新和删除书籍
文章目录 关于本教程 下载源代码 创建新书 创建模态表单 添加"新书"按钮 更新书 EditModal.cshtml.cs 从BookDto映射到CreateUpdateBookD ...
- Abp vnext Web应用程序开发教程 1 —— 创建服务器端
文章目录 关于本教程 下载源代码 创建解决方案 创建书籍实体 BookType枚举 将图书实体添加到DbContext 将图书实体映射到数据库表 添加数据库迁移 添加样本种子数据 更新数据库 创建应用 ...
- Abp vnext Web应用程序开发教程 2 —— 图书列表页面
文章目录 关于本教程 下载源代码 动态JavaScript代理 在开发者控制台中进行测试 本地化 创建书籍页面 将书籍页面添加到主菜单 图书列表 运行最终应用程序 下一部分 关于本教程 本教程基于版本 ...
- Abp vnext Web应用程序开发教程 5 —— 授权
文章目录 关于本教程 下载源代码 权限 权限名称 权限定义 权限管理界面 授权 应用层和HTTP API Razor页面 JavaScript端 菜单项 下一部分 关于本教程 本教程基于版本3.1 在 ...
最新文章
- iOS OC和Swift混编
- agentzh 的 Nginx 教程(版本 2015.03.19) 第一篇
- mysql获取当月数据_MySQL中获取天、周、月等数据
- oracle 表更新表,Oracle 更新表(另一张表)
- Mysql主主同步详细操作过程
- 使用 IAsyncResult 进行 .NET 异步编程
- 斯威夫特山地车_斯威夫特枚举
- 文字旋转_如何制作抖音文字旋转视频?推荐这款超火的抖音文字动画制作神器...
- 创建win10介质进度为0_win10介质创建工具(media creation tool)下载_win10介质创建工具(media creation tool)官方下载-太平洋下载中心...
- 基于 MPC 控制算法的自适应巡航系统的研究
- 人体模型 java代码_java3d人体模型.doc
- 孔夫子旧书网接口:实现输入ISBN获取图书信息
- ATN项目(智能矩阵Atmatrix)是否能做到人工智能界的桥梁,从而改变世界?
- 什么是软件危机?它有哪些典型表现?为什么会出现软件为危机?
- 阿里P6级别Java程序员月薪多少?阿里认证员工给出答案
- 正交试验设计的基本步骤
- 萨提亚亲密关系(摘抄)
- 洛谷1067 多项式输出 解题报告
- 松柏先生:制胜的一拳靠的不是运气,而是洞察力!
- java日期与时间戳相互转换大全
热门文章
- sql中exec是什么意思_SQL 中为什么经常要加NOLOCK?
- 安卓bmi项目_搭载安卓系统的智能健康一体机:上禾SH-V20
- new string(abc)创建了几个对象_面试题系列第2篇:new String()创建几个对象?有你不知道的...
- oracle一列有多个约束,在oracle中创建unique唯一约束(单列和多列)
- 传统春节海报设计没有思路?
- APP设计|搜索页面设计灵感
- 圣诞节插画素材|设计师再忙也要看一看,没准可以帮助到你!
- 【设计素材】表格数据形平面海报素材
- 设计师需要收藏|一起来看看UI设计的配色专辑
- 新高考改革选计算机专业要学什么,2020高考改革后考生如何选科与选专业?