Índice |
---|
Testes de integração compreendem a segunda fase do ciclo de testes de uma aplicação.
Após testar cada unidade o próximo passo é testar um grupo de funcionalidades, como um todo, fazendo a integração de todos os módulos da aplicação.
...
Se você construiu uma aplicação onde tenha utilizado uma infraestrutura com Entity Framework Core podemos utilizar um banco em memoria para realizar nossos testes integrados.
Vamos começar com a criação do modulo que fará o carregamento da estrutura de testes:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
[DependsOn( typeof(AppModule), typeof(TnfTestBaseModule))] public class EfCoreAppTestModule : TnfModule { public override void PreInitialize() { Configuration.Modules .TnfEfCoreInMemory(IocManager.IocContainer) .RegisterDbContextInMemory<ArchitectureDbContext>(); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } |
O modulo "EfCoreAppTestModule" foi criado no projeto de testes sendo responsável por carregar toda a estrutura de sua aplicação para o teste integrado quando você trabalhar com testes e Entity Framework em memoria.
Note que o atributo do modulo "DependsOn" tem como referencia outro modulo chamado "AppModule". Este modulo é um modulo da camada de aplicação concreta a ser testada, contendo dependências de outras camadas como domínio e infraestrutura onde as entidades estão sendo persistidas com o Entity Framework Core.
...
O código exemplificado acima, carrega o modulo da camada a ser testada, configurando no método "PreInitialize" o uso do Entity Framework Core em memoria para o DbContext "ArchitectureDbContext" através do método "RegisterDbContextInMemory".
Após a definição de nosso módulo vamos criar a classe de Setup para cada teste integrado usando Entity Framework Core em memoria.
.
Definido o modulo de teste vamos criar nosso classe de setup chamada "EfCoreAppTestBase" realizando Para isso a classe abaixo nomeada de "EfCoreAppTestBase" realiza a herança da classe "TnfEfCoreIntegratedTestBase<Module>" que recebe um TnfModule (implementado anteriormente):
...
Essa classe força a implementação do método "InitializeIntegratedTest" onde será definido o setup de dados.
nosso contexto do Entity Framework Core em memoria. A mesma classe expõe alguns métodos para inclusão de dados na memoria do contexto como podemos observar no exemplo acima usando a instrução "UsingDbContext<DbContext>".
Definida a classe que fará o setup de cada teste criado, podemos de setup, vamos começar a escrita de nossos testes sobre os serviços de aplicação:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
public class CountryAppServiceTests : EfCoreAppTestBase { private readonly ICountryAppService _countryAppService; public CountryAppServiceTests() { _countryAppService = LocalIocManager.Resolve<ICountryAppService>(); } [Fact] public void Service_Should_Not_Be_Null() { _countryAppService.ShouldNotBeNull(); } [Fact] public async Task Create_Item_With_Sucess() { var result = await _countryAppService.Create(new CountryDto() { Id = 6, Name = "Mexico" }); result.Name.ShouldBe("Mexico"); } [Fact] public async Task Get_Return_Item_With_Sucess() { var result = await _countryAppService.Get(new EntityDto<int>(1)); result.Id.ShouldBe(1); result.Name.ShouldBe("Brasil"); } } |
Note que no exemplo acima Acima realizamos a herança da nossa classe que realiza o setup dos dados em nosso contexto em memoria. Agora podemos Podemos agora executar nossos testes em nosso serviço de aplicação normalmente em cima da estrutura em memoria do Entity Framework Core.
Cada teste executado no cenário acima será de forma reproduzido de forma isolada.
Cada Todo teste executado contém seu próprio contexto do Entity Framework Core rodando separadamente dos demais.
...
Quando estamos trabalhando com repositórios sem o uso de um ORM, precisamos fazer o mock da interface do repositório simulando repositório, simulando um cenário afim de explorar todo o funcionamento do sistema.
Em nosso caso vamos teste funcionalidades usando testar a infraestrutura do Carol de nosso cenário de testes.
Para isso o TNF possui uma extensão onde é possível realizar a substituição de uma injeção e usar usando o NSubstitute para criar objeto de mock no injetor de dependência.
...
O modulo "NSubstituteAppTestModule" foi criado no projeto de testes sendo responsável por para carregar toda a estrutura de sua aplicação para o teste integrado.
...