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.

🤖 Întreabă AI despre acest articol

AI Răspuns generat de AI pe baza acestui articol.
AI scrie răspunsul…

Scrie un comentariu

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