Compartir comentarios
Las respuestas se generan en base a la documentación.

Escribe pruebas con Testcontainers

Añadir dependencias de Testcontainers

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

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

Escribir la prueba

Crea CustomerServiceTest.cs en el proyecto de pruebas:

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.