Тестування React додатків
Ми використовуємо Jest в Facebook для тестування React додатків.
Налаштування
Налаштування з Create React App
Якщо ви тільки починаєте знайомитися з React, рекомендуємо скористатись Create React App. Це готовий до використання інструмент і він поставляється з Jest! Вам лише потрібно бу де додати react-test-renderer
для рендерингу знімків.
Запустіть
- npm
- Yarn
- pnpm
npm install --save-dev react-test-renderer
yarn add --dev react-test-renderer
pnpm add --save-dev react-test-renderer
Налаштування без Create React App
Якщо у вас вже є існуючий додаток, вам потрібно встановити кілька пакунків, щоб змусити все працювати. Ми використовуємо пакет babel-jest
і babel-preset-react
для трансформації нашого коду в тестовому середовищі. Також перегляньте використання babel.
Запустіть
- npm
- Yarn
- pnpm
npm install --save-dev jest babel-jest @babel/preset-env @babel/preset-react react-test-renderer
yarn add --dev jest babel-jest @babel/preset-env @babel/preset-react react-test-renderer
pnpm add --save-dev jest babel-jest @babel/preset-env @babel/preset-react react-test-renderer
Ваш package.json
повинен виглядати приблизно так (де <current-version>
- це останні актуальні версії пакетів). Додайте необхідні скрипти і конфігурацію Jest:
{
"dependencies": {
"react": "<current-version>",
"react-dom": "<current-version>"
},
"devDependencies": {
"@babel/preset-env": "<current-version>",
"@babel/preset-react": "<current-version>",
"babel-jest": "<current-version>",
"jest": "<current-version>",
"react-test-renderer": "<current-version>"
},
"scripts": {
"test": "jest"
}
}
module.exports = {
presets: [
'@babel/preset-env',
['@babel/preset-react', {runtime: 'automatic'}],
],
};
І все готово!
Тестування з допомогою знімків
Давайте створимо тест, що використовує знімок для компонента Link, який відображає гіперпосилання:
import {useState} from 'react';
const STATUS = {
HOVERED: 'hovered',
NORMAL: 'normal',
};
export default function Link({page, children}) {
const [status, setStatus] = useState(STATUS.NORMAL);
const onMouseEnter = () => {
setStatus(STATUS.HOVERED);
};
const onMouseLeave = () => {
setStatus(STATUS.NORMAL);
};
return (
<a
className={status}
href={page || '#'}
onMouseEnter={onMouseEnter}
onMouseLeave={onMouseLeave}
>
{children}
</a>
);
}
Приклади використовують функціональні компоненти, проте класові компоненти можна перевірити аналогічно. See React: Function and Class Components. Reminders that with Class components, we expect Jest to be used to test props and not methods directly.
Тепер давайте використаємо тестовий рендерер React і функцію створення знімків Jest для взаємодії з компонентом, отримання результату його відображення і створення файла знімку:
import renderer from 'react-test-renderer';
import Link from '../Link';
it('changes the class when hovered', () => {
const component = renderer.create(
<Link page="http://www.facebook.com">Facebook</Link>,
);
let tree = component.toJSON();
expect(tree).toMatchSnapshot();
// вручну запускаємо зворотній виклик
renderer.act(() => {
tree.props.onMouseEnter();
});
// перерендерюємо
tree = component.toJSON();
expect(tree).toMatchSnapshot();
// вручну запускаємо зворотній виклик
renderer.act(() => {
tree.props.onMouseLeave();
});
// перерендерюємо
tree = component.toJSON();
expect(tree).toMatchSnapshot();
});