Что такое act()

Ответ

act() — это утилита из React Testing Library, которая оборачивает код, вызывающий обновления состояния или эффекты в React-компонентах. Она гарантирует, что все обновления DOM и эффекты выполняются синхронно перед проверками.

Пример с тестом:

import { render, screen, act } from '@testing-library/react';
import Counter from './Counter';

test('increments counter', () => {
  render(<Counter />);

  act(() => {
    fireEvent.click(screen.getByText('+1'));
  });

  expect(screen.getByText('1')).toBeInTheDocument();
});

Ключевые моменты:

  • act() нужен для тестов, где происходят изменения состояния
  • В React Testing Library многие методы (click, type и т.д.) уже обёрнуты в act()
  • Вручную act() требуется редко — обычно при работе с таймерами или сложными асинхронными операциями

Ответ 18+ 🔞

А, ну вот, смотри, опять этот ваш act(), блядь! Это ж как тот самый Герасим из «Муму» — с виду здоровый мужик, а без него нихуя не работает, всё виснет и молчит, как немой.

Короче, представь: ты пишешь тест, нажимаешь на кнопку в компоненте, а она, сука, должна счётчик увеличить. Но React, эта мартышлюшка хитрая, не сразу всё делает — он там состояния свои обновляет, эффекты запускает, как будто в озере купается. И если ты не обернёшь вызов, который это состояние меняет, в act(), то твой тест просто не увидит обновления и упадёт, как пьяный с лестницы. Чистый изумруд, блядь!

Вот смотри на код, тут всё просто:

import { render, screen, act } from '@testing-library/react';
import Counter from './Counter';

test('increments counter', () => {
  render(<Counter />);

  act(() => {
    fireEvent.click(screen.getByText('+1'));
  });

  expect(screen.getByText('1')).toBeInTheDocument();
});

Видишь? Мы как бы говорим React: «Слушай сюда, мудак, сейчас будет движ, ты там всё внутри себя приведи в порядок, все состояния обнови, DOM перерисуй, а потом уже мы будем проверять, что на экране». И он послушно делает, потому что act() его, блядь, дисциплинирует.

Но вот парадокс, ёпта! Чаще всего тебе этот act() вручную и не нужен! Потому что все эти fireEvent.click(), user.type() из React Testing Library уже сами, как хорошие ребята, обёрнуты в act(). Это они за тебя всю грязную работу делают, пока ты сидишь и пиздишь, что тесты не работают.

Ручной act() вылезает, как жопа из-под одеяла, только в особо запущенных случаях. Ну, типа:

  • Когда у тебя там таймеры, setTimeout или setInterval — эти, блядь, асинхронные выёбки.
  • Или когда ты сам, с горы, как хуй, запускаешь какое-нибудь сложное обещание (Promise), которое должно обновить состояние.
  • Короче, когда React теряет нить и не понимает, когда всё закончилось.

Так что запомни: act() — это как крик «Муму!» в тишине. Он заставляет систему отозваться. Но орать его на каждом углу не надо, а то соседи заебут. Используй точечно, только когда реально чувствуешь, что что-то идёт не так, и терпения ебать уже ноль.