...
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.