Тестирование хуков внутри компонентов React может быть выполнено с использованием библиотеки React Testing Library и Jest. Однако, если вы хотите протестировать хуки изолированно, без рендеринга компонента, вы можете использовать библиотеку React Hooks Testing Library.
1. Тестирование хуков внутри компонента с использованием React Testing Library:
Если ваш хук используется внутри компонента, вы можете протестировать его, рендеря компонент и имитируя пользовательские действия.
import React, { useState, useEffect } from 'react';
const Counter = () => {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
const increment = () => setCount(count + 1);
const decrement = () => setCount(count - 1);
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
<button onClick={decrement}>Decrement</button>
</div>
);
};
export default Counter;
Пример тестового файла Counter.test.js
:
import { render, screen, fireEvent } from '@testing-library/react';
import Counter from './Counter';
test('renders initial count and updates document title', () => {
render(<Counter />);
const countElement = screen.getByText(/Count: 0/i);
expect(countElement).toBeInTheDocument();
expect(document.title).toBe('Count: 0');
const incrementButton = screen.getByText(/Increment/i);
fireEvent.click(incrementButton);
const updatedCountElement = screen.getByText(/Count: 1/i);
expect(updatedCountElement).toBeInTheDocument();
expect(document.title).toBe('Count: 1');
});
2. Тестирование хуков изолированно с использованием React Hooks Testing Library:
Если вы хотите протестировать хук изолированно, без рендеринга компонента, вы можете использовать библиотеку React Hooks Testing Library.
npm install @testing-library/react-hooks
Пример хука:
import { useState, useEffect } from 'react';
const useCounter = () => {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
const increment = () => setCount(count + 1);
const decrement = () => setCount(count - 1);
return { count, increment, decrement };
};
export default useCounter;
Пример тестового файла useCounter.test.js
:
import { renderHook, act } from '@testing-library/react-hooks';
import useCounter from './useCounter';
test('should increment count and update document title', () => {
const { result } = renderHook(() => useCounter());
expect(result.current.count).toBe(0);
expect(document.title).toBe('Count: 0');
act(() => {
result.current.increment();
});
expect(result.current.count).toBe(1);
expect(document.title).toBe('Count: 1');
});
test('should decrement count and update document title', () => {
const { result } = renderHook(() => useCounter());
expect(result.current.count).toBe(0);
expect(document.title).toBe('Count: 0');
act(() => {
result.current.decrement();
});
expect(result.current.count).toBe(-1);
expect(document.title).toBe('Count: -1');
});