Jakeuj's Notes master Help

ABP.IO 新手教學 No.05 開發教學 第 4 部分 整合測試

這篇接續上一篇 開發教學 Part 3 創建、更新和刪除圖書

主要針對 ABP 的測試專案說明如何進行測試

對於沒做過測試的建議照著做一次提升程式交付品質

Web應用程序開發教程 - 第三章:集成測試

關於本教程

在本系列教程中,您將構建一個名稱Acme.BookStore的用於管理書籍及其作者列表的基於 ABP 的程序。是使用以下技術開發的:

  • Entity Framework Core 為ORM 提供程序。

  • Angular做為 UI 框架。

本教程分為以下部分:

下載源碼

本教程根據你的UI數據庫首選項有多個版本,我們準備了一個模型下載的源碼組件:

解決方案中的測試項目

這涉及到了服務器端測試。解決方案還有很多測試項目:

bookstore-test-projects-v2

各個項目用於測試相關的應用程序項目。測試項目使用以下庫進行測試:

添加測試數據

如果你已經按照第一個部分中的描述創建了數據種子貢獻者,則相同的數據用於測試中可用。因此你可以跳過此部分。如果你還沒有創建數據種子貢獻者(DataSeedContributor),可以使用BookStoreTestDataSeedContributor來為要在以下測試中使用的相同數據提供種子。

測試 BookAppService

Acme.BookStore.Application.Tests項目中創建一個有名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() { //Act var result = await _bookAppService.GetListAsync( new PagedAndSortedResultRequestDto() ); //Assert result.TotalCount.ShouldBeGreaterThan(0); result.Items.ShouldContain(b => b.Name == "1984"); } } }
  • 測試方法直接Should_Get_List_Of_Books使用BookAppService.GetListAsync方法來獲取用戶列表,並執行檢查。

  • 我們可以安全地檢查“1984”這本書的名稱,因為我們知道這本書可以在數據庫中找到,我們已經將其添加到衍生數據中。

1627019102

新增測試方法,創建一個合法書籍實體的場景:

[Fact] public async Task Should_Create_A_Valid_Book() { //Act var result = await _bookAppService.CreateAsync( new CreateUpdateBookDto { Name = "New test book 42", Price = 10, PublishDate = System.DateTime.Now, Type = BookType.ScienceFiction } ); //Assert result.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() { //Act var result = await _bookAppService.GetListAsync( new PagedAndSortedResultRequestDto() ); //Assert result.TotalCount.ShouldBeGreaterThan(0); result.Items.ShouldContain(b => b.Name == "1984"); } [Fact] public async Task Should_Create_A_Valid_Book() { //Act var result = await _bookAppService.CreateAsync( new CreateUpdateBookDto { Name = "New test book 42", Price = 10, PublishDate = System.DateTime.Now, Type = BookType.ScienceFiction } ); //Assert result.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")); } } }
1627024422

打開測試資源管理器 (測試 -> Windows -> 測試資源管理器)並執行所有測試:

書店應用服務測試

恭喜你, 綠色圖標表示測試已成功通過!

下一章

查看本教程的下一章

Jakeuj

PS5

  • ABP

  • 回首頁

本文章從點部落遷移至 Writerside

14 October 2025