Testare automată în React + .NET Core: de la unit la integration

  • Doru Bulubasa
  • 11 June 2025

În orice aplicație serioasă – fie ea un blog, un magazin online sau un dashboard enterprise – testele automate nu mai sunt un „lux”, ci o necesitate. Ele oferă încredere în cod, ușurează refactorizările și accelerează livrarea de funcționalitate. În acest articol vei învăța cum să testezi aplicația ta React + .NET Core pe toate nivelurile: domeniu, aplicație, API și frontend.


✅ 1. Testarea logicii de domeniu (xUnit/NUnit)

Începem cu cea mai pură zonă a codului: modelul de domeniu (Domain Layer), unde se află regulile de business.

Exemplu: Agregatul Post

public class Post
{
    public Guid Id { get; private set; }
    public Slug Slug { get; private set; }
    public PostContent Content { get; private set; }

    public Post(Slug slug, PostContent content)
    {
        Id = Guid.NewGuid();
        Slug = slug;
        Content = content;
    }
}

Test cu xUnit

public class PostTests
{
    [Fact]
    public void Constructor_Should_SetSlugAndContent()
    {
        // Arrange
        var slug = new Slug("primul-post");
        var content = new PostContent("Salut lume!");

        // Act
        var post = new Post(slug, content);

        // Assert
        Assert.Equal(slug, post.Slug);
        Assert.Equal(content, post.Content);
    }
}

✅ Bonus: Folosește FluentAssertions pentru assert-uri expresive.


✅ 2. Testarea serviciilor de aplicație

Application Layer conține logica de orchestrare. Aici lucrăm cu comenzi, query-uri și handleri (dacă folosești MediatR).

Exemplu: CreatePostCommandHandler

public class CreatePostCommandHandler : IRequestHandler<CreatePostCommand, Guid>
{
    public Task<Guid> Handle(CreatePostCommand request, CancellationToken cancellationToken)
    {
        // Creează un nou post, salvează în repo etc.
    }
}

Test

[Fact]
public async Task Handle_ShouldReturnPostId_WhenPostIsCreated()
{
    // Arrange
    var command = new CreatePostCommand("titlu", "continut");
    var handler = new CreatePostCommandHandler(/* mocks */);

    // Act
    var result = await handler.Handle(command, CancellationToken.None);

    // Assert
    result.Should().NotBeEmpty();
}

✅ Tool-uri utile:

  • Moq pentru mocking

  • AutoFixture pentru generarea rapidă a datelor


✅ 3. Testarea controllerelor (integration tests)

Cu WebApplicationFactory putem scrie teste care pornesc aplicația ca într-un mediu real, dar cu DB in-memory (SQLite sau UseInMemoryDatabase()).

Setup

public class CustomWebAppFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            services.RemoveAll(typeof(DbContextOptions<AppDbContext>));
            services.AddDbContext<AppDbContext>(options =>
                options.UseInMemoryDatabase("TestDb"));
        });
    }
}

Test

[Fact]
public async Task GetPosts_ShouldReturn200()
{
    var client = _factory.CreateClient();
    var response = await client.GetAsync("/api/posts");

    response.StatusCode.Should().Be(HttpStatusCode.OK);
}


✅ 4. Testarea componentelor React (Vitest + React Testing Library)

Pe frontend, folosim Vitest (vite-native) împreună cu @testing-library/react.

Exemplu: PostList

export function PostList({ posts }: { posts: Post[] }) {
  return (
    <ul>
      {posts.map(p => <li key={p.id}>{p.title}</li>)}
    </ul>
  );
}

Test

import { render, screen } from "@testing-library/react";
import { PostList } from "./PostList";

test("renders post titles", () => {
  render(<PostList posts={[{ id: "1", title: "Salut!" }]} />);
  expect(screen.getByText("Salut!")).toBeInTheDocument();
});

✅ Bonus: Folosește msw (Mock Service Worker) pentru a intercepta request-uri API în teste.


Concluzie

Acum ai o imagine completă a testării într-o aplicație React + .NET:

  • 🧠 Unit tests pentru modelul de domeniu

  • 🧩 Teste de aplicație pentru handleri și servicii

  • 🌐 Integration tests pentru API

  • 🎯 UI tests pentru React

Recomandare: Include testele în CI/CD (GitHub Actions) pentru verificări automate la fiecare commit.

Scrie un comentariu

Adresa de mail nu va fi publicata. Campurile obligatorii sunt marcate cu *