ASP.NET Core MVC / Razor页面教程-第3部分(集成测试)
1、测试解决方案中的项目
本部分介绍服务器端测试。解决方案中有几个测试项目:
每个项目都用于测试相关项目。测试项目使用以下库进行测试:
- Xunit作为主要测试框架。
- Shoudly作为断言库。
- NSubstitute作为模拟库。
2、添加测试数据
启动模板包含ABPBookStore.TestBase
项目中的ABPBookStoreTestDataBuilder
类,该类创建用于运行测试的初始数据。更改ABPBookStoreTestDataSeedContributor
类的内容,如下所示:
using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids;
namespace ABPBookStore
{
public class ABPBookStoreTestDataSeedContributor
: IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Book, Guid> _bookRepository;
private readonly IGuidGenerator _guidGenerator;
public ABPBookStoreTestDataSeedContributor(
IRepository<Book, Guid> bookRepository,
IGuidGenerator guidGenerator)
{
_bookRepository = bookRepository;
_guidGenerator = guidGenerator;
}
public async Task SeedAsync(DataSeedContext context)
{
await _bookRepository.InsertAsync(
new Book(id: _guidGenerator.Create(),
name: "Test book 1",
type: BookType.Fantastic,
publishDate: new DateTime(2015, 05, 24),
price: 21
)
);
await _bookRepository.InsertAsync(
new Book(id: _guidGenerator.Create(),
name: "Test book 2",
type: BookType.Science,
publishDate: new DateTime(2014, 02, 11),
price: 15
)
);
}
}
}
-
IRepository<Book, Guid>
被注入并用于SeedAsync
创建两个书籍实体作为测试数据。 -
IGuidGenerator
被注入以创建GUID。虽然Guid.NewGuid()
可以完美地进行测试,但IGuidGenerator
具有其他功能,在使用实际数据库时尤其重要。
3、测试应用程序服务BookAppService
在Acme.BookStore.Application.Tests
项目中创建一个BookAppService_Tests
命名的测试类:
using Shouldly;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Xunit;
namespace ABPBookStore
{
public class BookAppService_Tests : ABPBookStoreApplicationTestBase
{
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 == "Test book 1");
}
}
}Should_Get_List_Of_Books
测试仅使用BookAppService.GetListAsync
方法来获取并检查用户列表。
添加一个新测试以创建一本有效的新书:
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<Volo.Abp.Validation.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”->“测试资源管理器”菜单),然后运行“所有测试”: