# Escribe pruebas con Testcontainers


## Añadir dependencias de Testcontainers

Añade el módulo de Testcontainers PostgreSQL al proyecto de pruebas:

```console
$ dotnet add ./CustomerService.Tests/CustomerService.Tests.csproj package Testcontainers.PostgreSql
```

## Escribir la prueba

Crea `CustomerServiceTest.cs` en el proyecto de pruebas:

```csharp
using Testcontainers.PostgreSql;

namespace Customers.Tests;

public sealed class CustomerServiceTest : IAsyncLifetime
{
    private readonly PostgreSqlContainer _postgres = new PostgreSqlBuilder()
        .WithImage("postgres:16-alpine")
        .Build();

    public Task InitializeAsync()
    {
        return _postgres.StartAsync();
    }

    public Task DisposeAsync()
    {
        return _postgres.DisposeAsync().AsTask();
    }

    [Fact]
    public void ShouldReturnTwoCustomers()
    {
        // Given
        var customerService = new CustomerService(new DbConnectionProvider(_postgres.GetConnectionString()));

        // When
        customerService.Create(new Customer(1, "George"));
        customerService.Create(new Customer(2, "John"));
        var customers = customerService.GetCustomers();

        // Then
        Assert.Equal(2, customers.Count());
    }
}
```

Esto es lo que hace la prueba:

- Declara un `PostgreSqlContainer` usando el `PostgreSqlBuilder` con la imagen de Docker `postgres:16-alpine`.
- Implementa `IAsyncLifetime` para la gestión del ciclo de vida del contenedor:
  - `InitializeAsync()` inicia el contenedor antes de que se ejecute la prueba.
  - `DisposeAsync()` detiene y elimina el contenedor después de que la prueba finaliza.
- `ShouldReturnTwoCustomers()` crea un `CustomerService` con los detalles de conexión del contenedor, inserta dos clientes, obtiene todos los clientes y verifica la cantidad.

