| title | act |
|---|
actλ ν
μ€νΈ ν¬νΌHelperλ‘, λκΈ° μ€μΈ React μ
λ°μ΄νΈλ₯Ό λͺ¨λ μ μ©ν λ€ λ¨μΈAssertν μ μκ² λμμ μ€λλ€.
await act(async actFn)μ»΄ν¬λνΈλ₯Ό λ¨μΈAssertionν μ μλλ‘ μ€λΉνλ €λ©΄ await act() νΈμΆ μμ μ»΄ν¬λνΈλ₯Ό λ λλ§νκ³ μ
λ°μ΄νΈνλ μ½λλ₯Ό κ°μΈμΈμ. μ΄λ κ² νλ©΄ ν
μ€νΈκ° λΈλΌμ°μ μμ μλνλ μ€μ React λ°©μκ³Ό λ μ μ¬νκ² μ€νλ©λλ€.
UI ν
μ€νΈλ₯Ό μμ±ν λ λ λλ§, μ¬μ©μ μ΄λ²€νΈ, λ°μ΄ν° κ°μ Έμ€κΈ° λ±μ μ¬μ©μ μΈν°νμ΄μ€μμ μνΈμμ© "λ¨μ"λ‘ λ³Ό μ μμ΅λλ€. Reactλ act()λΌλ ν¬νΌλ₯Ό μ 곡νλλ° μ΄λ μ΄ "λ¨μ"μ κ΄λ ¨λ λͺ¨λ μ
λ°μ΄νΈκ° DOMμ μ μ©λκΈ° μ κΉμ§ λ¨μΈμ΄ μ€νλμ§ μλλ‘ λ³΄μ₯ν΄ μ€λλ€.
act λΌλ μ΄λ¦μ Arrange-Act-Assert ν¨ν΄μμ λ°μ¨ κ²μ
λλ€.
it ('renders with button disabled', async () => {
await act(async () => {
root.render(<TestComponent />)
});
expect(container.querySelector('button')).toBeDisabled();
});actλ awaitμ async ν¨μμ ν¨κ» μ¬μ©νλ κ²μ κΆμ₯ν©λλ€. λκΈ° λ²μ λ λλΆλΆμ κ²½μ° λμνμ§λ§ Reactκ° λ΄λΆμ μΌλ‘ μ
λ°μ΄νΈλ₯Ό μμ½νλ λ°©μ λλ¬Έμ μΈμ λκΈ° λ²μ μ μ¨λ λλμ§ μμΈ‘νκΈ° μ΄λ ΅μ΅λλ€.
μμΌλ‘ λκΈ° λ²μ μ λ μ΄μ μ¬μ©λμ§ μμ μμ μ΄λ©° μ κ±°λ μμ μ λλ€.
async actFn: ν μ€νΈν μ»΄ν¬λνΈλ₯Ό λ λλ§νκ±°λ μνΈμμ©μ μννλ λΉλκΈ° ν¨μμ λλ€.actFnλ΄λΆμμ λ°μνλ μ λ°μ΄νΈλ λ΄λΆ act νμ μΆκ°λλ©° λͺ¨λ λͺ¨μμ DOMμ μ μ©λ©λλ€. λΉλκΈ° ν¨μμ΄κΈ° λλ¬Έμ Reactλ λΉλκΈ° κ²½κ³λ₯Ό λλ μ½λλ μ€ννκ³ μμ½λ μ λ°μ΄νΈλ ν¨κ» μ²λ¦¬ν©λλ€.
actλ μ무 κ°λ λ°ννμ§ μμ΅λλ€.
μ»΄ν¬λνΈλ₯Ό ν
μ€νΈν λ actλ₯Ό μ¬μ©νλ©΄ μΆλ ₯ κ²°κ³Όμ λν λ¨μΈμ λ μμ νκ² ν μ μμ΅λλ€.
μμλ‘ CounterλΌλ μ»΄ν¬λνΈκ° μλ€κ³ κ°μ νκ³ μλ μ¬μ© μμλ μ΄λ₯Ό ν
μ€νΈνλ λ°©λ²μ 보μ¬μ€λλ€.
function Counter() {
const [count, setCount] = useState(0);
const handleClick = () => {
setCount(prev => prev + 1);
}
useEffect(() => {
document.title = `You clicked ${count} times`;
}, [count]);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={handleClick}>
Click me
</button>
</div>
)
}μ»΄ν¬λνΈμ λ λλ§ κ²°κ³Όλ₯Ό ν
μ€νΈνλ €λ©΄ λ λλ§ μ½λλ₯Ό act()λ‘ κ°μΈμΌ ν©λλ€.
import {act} from 'react';
import ReactDOMClient from 'react-dom/client';
import Counter from './Counter';
it('can render and update a counter', async () => {
container = document.createElement('div');
document.body.appendChild(container);
// β
μ»΄ν¬λνΈλ₯Ό act() μμμ λ λλ§ν©λλ€.
await act(() => {
ReactDOMClient.createRoot(container).render(<Counter />);
});
const button = container.querySelector('button');
const label = container.querySelector('p');
expect(label.textContent).toBe('You clicked 0 times');
expect(document.title).toBe('You clicked 0 times');
});μ μμμμλ 컨ν
μ΄λλ₯Ό λ§λ€κ³ λ¬Έμμ μΆκ°ν λ€ Counter μ»΄ν¬λνΈλ₯Ό act() μμμ λ λλ§ν©λλ€. μ΄λ κ² νλ©΄ μ»΄ν¬λνΈκ° λ λλ§λκ³ ν¨κ³Όκ° μ μ©λ νμ λ¨μΈμ μνν μ μμ΅λλ€.
actλ₯Ό μ¬μ©νλ©΄ λͺ¨λ μ
λ°μ΄νΈκ° μ μ©λ λ€ λ¨μΈμ μ€νν μ μμ΅λλ€.
μ΄λ²€νΈλ₯Ό ν
μ€νΈνλ €λ©΄ μ΄λ²€νΈλ₯Ό act()λ‘ κ°μΈμΈμ.
import {act} from 'react';
import ReactDOMClient from 'react-dom/client';
import Counter from './Counter';
it.only('can render and update a counter', async () => {
const container = document.createElement('div');
document.body.appendChild(container);
await act( async () => {
ReactDOMClient.createRoot(container).render(<Counter />);
});
// β
μ΄λ²€νΈ λμ€ν¨μΉλ₯Ό act() μμμ μ€νν©λλ€.
await act(async () => {
button.dispatchEvent(new MouseEvent('click', { bubbles: true }));
});
const button = container.querySelector('button');
const label = container.querySelector('p');
expect(label.textContent).toBe('You clicked 1 times');
expect(document.title).toBe('You clicked 1 times');
});μ μμμμλ μ»΄ν¬λνΈλ₯Ό λ¨Όμ actλ‘ κ°μΈ λ λλ§νκ³ , μ΄λ²€νΈ λμ€ν¨μΉλ act()λ‘ κ°μλλ€. μ΄λ κ² νλ©΄ ν΄λΉ μ΄λ²€νΈλ‘ μΈν λͺ¨λ μ
λ°μ΄νΈκ° μ μ©λ λ€ λ¨μΈμ΄ μνλ©λλ€.
DOM μ΄λ²€νΈλ₯Ό λμ€ν¨μΉν λλ DOM 컨ν μ΄λκ° λ¬Έμμ μΆκ°λμ΄ μμ΄μΌ ν©λλ€. λ°λ³΅λλ μ€μ μ½λλ₯Ό μ€μ΄κ³ μΆλ€λ©΄ React Testing Libraryλ₯Ό μ¬μ©νλ κ²λ κ³ λ €ν΄λ³΄μΈμ.
"The current testing environment is not configured to support act(...)" μ€λ₯κ° λ°μνλ κ²½μ° {/error-the-current-testing-environment-is-not-configured-to-support-act/}
actλ₯Ό μ¬μ©νλ €λ©΄ ν
μ€νΈ νκ²½μμ global.IS_REACT_ACT_ENVIRONMENT=trueλ₯Ό μ€μ ν΄μΌ ν©λλ€. μ΄ μ€μ μ actκ° μ¬λ°λ₯Έ νκ²½μμλ§ μ¬μ©λλλ‘ λ³΄μ₯ν©λλ€.
μ΄ μ μ μ€μ μ΄ μμΌλ©΄ λ€μκ³Ό κ°μ μ€λ₯κ° νμλ©λλ€.
Warning: The current testing environment is not configured to support act(...)
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ React ν μ€νΈλ₯Ό μν μ μ μ€μ νμΌμ λ€μ μ½λλ₯Ό μΆκ°νμΈμ.
global.IS_REACT_ACT_ENVIRONMENT=trueReact Testing Libraryκ°μ ν
μ€νΈ νλ μμν¬μμλ IS_REACT_ACT_ENVIRONMENTκ° μ΄λ―Έ μ€μ λμ΄ μμ΅λλ€.