You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
abp/docs/pt-BR/Tutorials/Angular/Part-III.md

5.7 KiB

Tutorial do ASP.NET Core MVC - Parte III

Sobre este tutorial

Esta é a terceira parte da série de tutoriais Angular. Veja todas as peças:

Esta parte abrange os testes do lado do servidor . Você pode acessar o código fonte do aplicativo no repositório GitHub .

Testar projetos na solução

Existem vários projetos de teste na solução:

livraria-teste-projetos

Cada projeto é usado para testar o projeto de aplicativo relacionado. Os projetos de teste usam as seguintes bibliotecas para teste:

  • xunit como a principal estrutura de teste.
  • Shouldly como uma biblioteca de asserções.
  • NSubstitute como uma biblioteca de zombaria.

Adicionando dados de teste

O modelo de inicialização contém a BookStoreTestDataSeedContributorclasse no Acme.BookStore.TestBaseprojeto que cria alguns dados para executar os testes.

Mude a BookStoreTestDataSeedContributorclasse como mostrado abaixo:

using System;
using System.Threading.Tasks;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Guids;

namespace Acme.BookStore
{
    public class BookStoreTestDataSeedContributor
        : IDataSeedContributor, ITransientDependency
    {
        private readonly IRepository<Book, Guid> _bookRepository;
        private readonly IGuidGenerator _guidGenerator;

        public BookStoreTestDataSeedContributor(
            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
                }
            );
        }
    }
}
  • Injetado IRepository<Book, Guid>e usado no SeedAsyncpara criar duas entidades de livro como dados de teste.
  • IGuidGeneratorServiço usado para criar GUIDs. Embora Guid.NewGuid()funcionasse perfeitamente para testes, IGuidGeneratorpossui recursos adicionais especialmente importantes ao usar bancos de dados reais (consulte o documento de geração do Guid para obter mais informações).

Testando o BookAppService

Crie uma classe de teste denominada BookAppService_Testsno Acme.BookStore.Application.Testsprojeto:

using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Xunit;

namespace Acme.BookStore
{
    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 == "Test book 1");
        }
    }
}
  • Should_Get_List_Of_BooksO teste simplesmente usa o BookAppService.GetListAsyncmétodo para obter e verificar a lista de usuários.

Adicione um novo teste que crie um novo livro válido:

[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");
}

Adicione um novo teste que tente criar um livro inválido e falhe:

[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"));
}
  • Como o Nameestá vazio, o ABP lança um AbpValidationException.

Abra a janela Test Explorer (use o menu Test -> Windows -> Test Explorer, se não estiver visível) e execute Todos os testes:

testes de serviço de livraria

Parabéns, ícones verdes mostram que os testes foram aprovados com sucesso!