Pruebas en C#: Unit, Integration y E2E para proyectos .NET

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course
```html

Pruebas en C#: Unit, Integration y E2E — guía completa para desarrolladores .NET



La calidad del software comienza con las pruebas. En el ecosistema C# (.NET) existe una cultura de pruebas establecida que incluye tres niveles clave: pruebas unitarias (unit), de integración (integration) y de extremo a extremo (E2E). En este artículo analizaremos cada nivel con ejemplos prácticos, mostraremos las mejores librerías y explicaremos cómo construir una estrategia de pruebas efectiva para tu proyecto .NET.



1. Pruebas unitarias en C#: la base de la calidad del código



Unit tests (pruebas unitarias) verifican el funcionamiento de componentes individuales del programa — métodos, clases, funciones — de forma aislada de las dependencias externas. En .NET los frameworks principales son xUnit, NUnit y MSTest. El más popular es xUnit gracias a su flexibilidad e integración con .NET Core.



Librerías para unit tests:

  • xUnit — framework principal (recomendado por Microsoft)
  • Moq — creación de objetos mock para aislar dependencias
  • FluentAssertions — expresiones de aserción mejoradas
  • AutoFixture — generación automática de datos de prueba


Ejemplo de unit test con xUnit y Moq:



using Xunit;using Moq;using FluentAssertions;

public class OrderServiceTests{ [Fact] public void CalculateTotal_WithValidItems_ReturnsCorrectSum() { // Arrange var mockRepo = new Mock<IProductRepository>(); mockRepo.Setup(r => r.GetPrice(1)).Returns(100m); mockRepo.Setup(r => r.GetPrice(2)).Returns(50m);

var service = new OrderService(mockRepo.Object); var items = new List<OrderItem> { new OrderItem { ProductId = 1, Quantity = 2 }, new OrderItem { ProductId = 2, Quantity = 1 } };

// Act var total = service.CalculateTotal(items);

// Assert total.Should().Be(250m); mockRepo.Verify(r => r.GetPrice(1), Times.Once); mockRepo.Verify(r => r.GetPrice(2), Times.Once); }}


Consejos para unit tests:

  • Sigue el patrón AAA (Arrange, Act, Assert)
  • Una prueba — una verificación (un assert)
  • Usa [Theory] con [InlineData] para parametrización
  • No pruebes servicios externos — usa mocks


2. Pruebas de integración: verificación de la interacción entre componentes



Integration tests (pruebas de integración) verifican cómo los diferentes módulos del sistema trabajan juntos: base de datos, sistema de archivos, APIs externas. A diferencia de los unit tests, aquí utilizamos dependencias reales o cercanas a la realidad.



Herramientas para pruebas de integración en .NET:

  • Microsoft.AspNetCore.TestHost — servidor web embebido
  • TestContainers — contenedorización de BD (PostgreSQL, SQL Server, Redis)
  • Respawn — limpieza de la base de datos entre pruebas
  • WebApplicationFactory<T> — creación del host de prueba


Ejemplo de integration test con TestContainers y WebApplicationFactory:



using Microsoft.AspNetCore.Mvc.Testing;using Testcontainers.PostgreSql;using Xunit;

public class UserApiIntegrationTests : IAsyncLifetime{ private readonly PostgreSqlContainer _dbContainer; private WebApplicationFactory<Program> _factory;

public UserApiIntegrationTests() { _dbContainer = new PostgreSqlBuilder() .WithImage("postgres:15") .WithDatabase("testdb") .WithUsername("tes ```

Blogs

Book Recommendations