Abp vNext 学习(5)

Abp vNext 学习第五弹 - 集成测试

参考上一篇 :Abp vNext 学习(4).

解决方案中的测试项目

这一部分涵盖了 服务器端 测试. 解决方案中有多个测试项目:

bookstore test projects

每个项目用于测试相关的应用程序项目.测试项目使用以下库进行测试:

  • xunit 作为主测试框架.
  • Shoudly 作为断言库.
  • NSubstitute 作为模拟库.

测试项目配置为使用 SQLite内存 作为数据库. 创建一个单独的数据库实例并使用 DataSeeder System 初始化种子数据,为每个测试准备一个新的数据库.

添加测试数据

如果你已经按照第二弹中的描述创建了DataSeedContributor,则相同的数据也在测试中可用. 因此你可以跳过此部分. 如果你尚未创建,可以使用 BookStoreTestDataSeedContributor 来为创建在以下测试中使用的相同数据种子.

测试 BookAppService

Acme.BookStore.Application.Tests 项目的 Books 命名空间(文件夹)中创建一个名叫 BookAppService_Tests 的测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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");
}
}
}
  • 测试方法 Should_Get_List_Of_Books 直接使用 BookAppService.GetListAsync 方法来获取用户列表,并执行检查.
  • 我们可以安全地检查 “1984” 这本书的名称,因为我们知道这本书可以在数据库中找到,我们已将其添加到种子数据中.

新增测试方法,用以测试创建一个合法book实体的场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[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 = DateTime.Now,
Type = BookType.ScienceFiction
}
);

//Assert
result.Id.ShouldNotBe(Guid.Empty);
result.Name.ShouldBe("New test book 42");
}

新增测试方法,用以测试创建一个非法book实体失败的场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[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 异常.

打开测试资源管理器(测试 -> Windows -> 测试资源管理器)并执行所有测试:

Test Result

Demo Codes

github commit

下一章

参阅的Abp vNext 学习(6)