Versão
Idioma

Tutorial do ASP.NET Core MVC - Parte III

Sobre este tutorial

Esta é a terceira parte da série de tutoriais do ASP.NET Core MVC. Veja todas as peças:

Você pode acessar o código fonte do aplicativo no repositório GitHub.

Você também pode assistir a este curso em vídeo preparado por um membro da comunidade ABP, com base neste tutorial.

Testar projetos na solução

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

livraria-teste-projetos-v2

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.
  • Altamente 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!

Esta página foi útil?
Por favor, faça uma seleção.
Obrigado pelo seu valioso feedback!

Observe que, embora não possamos responder aos comentários, nossa equipe usará seus comentários para melhorar a experiência.

Neste documento
Mastering ABP Framework Book
Dominando a estrutura ABP

Este livro o ajudará a obter uma compreensão completa da estrutura e das técnicas modernas de desenvolvimento de aplicativos da web.