Criando testes de integração no ASP.NET core | Parte 1
Published: 2024-01-07 22:05:00

## **Uma rápida passada em testes unitários**

De modo geral, os testes unitários testam, isoladamente, a menor unidade de um código, ou seja: os métodos e classes sem acesso a banco ou serviços externos.

Os testes unitários são de rápida execução, desenvolvimento, refatoração e detecção de bugs no código.

É bom lembrar que os testes unitários são totalmente mockados, isto é, as implementações das classes mockam acessos a repositórios, serviços etc.


## **Os testes de integração**

![A famosa pirâmide de testes](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3955uyg17k9ocb1ukwy6.jpg)

Os testes de integração desempenham o papel de avaliar a interação entre diferentes componentes do sistema, a fim de verificar seu funcionamento em conjunto.

É por meio desses testes que asseguramos a consistência das interações entre diversas partes do sistema, validamos fluxos complexos e completos, garantindo assim a qualidade do código como um todo, não se limitando a uma única parte isolada.

Sim, eles são mais complexos de desenvolver e manter, além de serem mais lentos ao serem executados em comparação aos testes de unidade. Isso ocorre porque testam funcionalidades completas, inclusive a persistência dos dados quando aplicável, ou o acesso a serviços externos.

## **Vamos ao código**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g3kcomgz82dxja32xns4.gif)

**Edite o arquivo do projeto da API dando visibilidade da sua api ao testes:**

![Editando o project file](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mclmn356oh8c1b176l7p.gif)

```
`<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <InvariantGlobalization>true</InvariantGlobalization>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Dapper" Version="2.1.28" />
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.0" />
    <PackageReference Include="Npgsql" Version="8.0.1" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
  </ItemGroup>

	<ItemGroup>
		<InternalsVisibleTo Include="CheckoutApiTests"/>
	</ItemGroup>
</Project>`

```

**Exponha seu Program.cs adicionando a linha ao final do arquivo:**

```
public partial class Program { }
```

**Crie a classe de testes integrados** 

```
namespace CheckoutApiTests
{
    public class CheckoutServiceIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
    {
        private readonly WebApplicationFactory<Program> _sut;
        public CheckoutServiceIntegrationTests(WebApplicationFactory<Program> sut)
        {
            _sut = sut;
        }
    }
}
```

**Sut é um acrônimo para System Under Test**

**Opcional: adicione um enviroment variable **

```
 public CheckoutServiceIntegrationTests(WebApplicationFactory<Program> sut)
 {
     _sut = sut.WithWebHostBuilder(builder =>
     {
         builder.UseEnvironment("Development");
     });
 }
```

**Crie um teste **

```
[Fact]
![Criando um teste de integração](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0u3j6ewycp0ec9mjlwz9.gif)


public async Task PostCheckout_ReturnsOkWithInsertedId_WhenValidData()
{
    var client = _sut.CreateClient();

    var checkoutData = new
    {
        CardNumber = "10000011100011",
        UserId = Guid.NewGuid(),
        ExpirationDate = "12/25",
        SecurityCode = "123",
        Amount = 19,
        Currency = "BRL"
    };

    var content = new StringContent(JsonSerializer.Serialize(checkoutData), System.Text.Encoding.UTF8, "application/json");

    var response = await client.PostAsync("/checkout", content);

    Assert.Equal(HttpStatusCode.OK, response.StatusCode);

    var responseContent = await response.Content.ReadAsStringAsync();
    var insertedId = JsonSerializer.Deserialize<Guid>(responseContent);

    Assert.NotEqual(Guid.Empty, insertedId);
}
```

**Hora de rodar os testes**

![Teste com sucesso! =](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7xuf8j2rnjklxn2209fg.png)

Lembrando que esses testes estão conectados no banco de desenvolvimento, portanto um registro foi criado na tabela:

![Select da tabela de checkout com o registro inserido via teste de integração](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k5n9mmubxrukiy1x18st.png)

E agora você sabe como criar testes de integração, hora de botar a mão na massa e criar mais testes.

No próximo artigo vamos utilizar o Testcontainers para criar um banco em tempo de execução dos testes integrados! 

Até mais!