...
O TNF prove algumas estruturas para realização de testes em sua aplicação. Não é uma regra, mas sugerimos os seguintes frameworks para utilização em seu projeto.
É um framework free, voltado a comunidade Framework open source, largamente utilizado para realizar testes na plataforma .NET. Ele suporte suporta todas as tecnologias, atualmente fazendo parte do .NET Foundation.
Para sua instalação basta realizar a adição de 2 pacotes via nuget ao seu assembly: xunit e xunit.runner.visualstudio.
Referencia: https://xunit.github.io/
Consiste em um framework Framework open source para realização de .NET mocking. Com ele é possível realizar mock de propriedades, classes, interfaces entre outras funcionalidades.
Para sua utilização, basta realizar a instalação do pacote NSubstitute via interface nuget.
Referencia: http://nsubstitute.github.io/
...
Framework com estrutura de asserção. Junto com o Xunit fornece uma gama de metodos métodos de extensão para realizar os assert e validações de regras, objetos e comportamentos.
Para sua utilização, basta realizar a instalação do pacote Shouldly via interface nuget.
Referencia: https://github.com/shouldly/shouldly
...
Esse serviço realiza a validação da entidade de domínio President, utilizando o padrão de builder do TNF com o uso de specifications.
Abaixo temos a implementação do serviço WhiteHouseService usando um repositório chamado IWhiteHouseRepositoriy implementado pela camada de infraestrutura consumindo dados do Carol.
...
Caso a entidade esteja apta a ser cadastrada os dados são persistidos no repositório e um evento de criação de um presidente é disparado.
Abaixo podemos conferir a estrutura de validação da entidade através de builder para a entidade President:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class PresidentBuilder : Builder<President> { public PresidentBuilder() : base() { } public PresidentBuilder(President instance) : base(instance) { } public PresidentBuilder WithId(string id) { Instance.Id = id; return this; } public PresidentBuilder WithName(string name) { Instance.Name = name; return this; } public override BuilderResponse<President> Build() { // Entity specifications var shouldHaveName = new PresidentShouldHaveNameSpecification(); if (!shouldHaveName.IsSatisfiedBy(Instance)) { var notificationMessage = LocalizationHelper.GetString( AppConsts.LocalizationSourceName, President.Error.PresidentNameMustHaveValue); Response.AddNotification(President.Error.PresidentNameMustHaveValue, notificationMessage); } return base.Build(); } } |
Temos dois serviços Serviços de aplicação em nosso cenário:
...
:
...
Abaixo podemos visualizar as interfaces de cada serviço de nosso cenário:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public interface ICountryAppService : IAsyncCrudAppService<CountryDto> { } |
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public interface IWhiteHouseAppService : IApplicationService { Task<PagingDtoResponse<PresidentDto>> GetAllPresidents(GellAllPresidentsRequestDto request); Task<PresidentDto> GetPresidentById(string id); Task<DtoResponseBase<List<PresidentDto>>> InsertPresidentAsync(List<PresidentDto> dtos, bool sync = true); Task<DtoResponseBase> UpdatePresidentAsync(PresidentDto dto); Task<DtoResponseBase> DeletePresidentAsync(string id); } |
...
Definida a estrutura de nosso cenário nos próximos tópicos vamos descrever como realizar os testes unitários e integrados.