Как использовать хуки внутри jest тестов
Я недавно начал изучать Jest и никак не могу понять, как использовать хуки в тестах Jest. Суть в том, что не работают именно React хуки. При помещении хука в 'name.test.tsx' выдает ошибку :
useSubmitAuthor > 1
-----
TypeError: Cannot read properties of null (reading 'useState')Jest
Хотя я не уверен правильно ли так делать
код useInputChange.tsx :
import { ChangeEvent } from 'react';
function useInputChange(setText: (text: string) => void) {
if (setText) {
return {
onChange: (event: ChangeEvent<HTMLInputElement>) => setText(event.target.value),
};
}
return { onChange: () => {} };
}
export default useInputChange;
код useInputChange.text.tsx :
import '@testing-library/jest-dom';
import React, { useState } from 'react';
describe('useInputChange', () => {
it('1', () => {
const [text, setText] = useState('') // тут ошибка
expect(text).toBe('')
render(
<div>
<input type="text" data-testid="input" />
<p>{text}</p>
</div>
);
});
});
Ответы (1 шт):
Автор решения: Konstantin Naumenko
→ Ссылка
Хук нужно передать коллбэком в renderHook() а setState() в act()
renderHook() и act() импортируются из @testing-library/react
Было:
import '@testing-library/jest-dom';
import React, { useState } from 'react';
describe('useInputChange', () => {
it('1', () => {
const [text, setText] = useState('') // тут ошибка
expect(text).toBe('')
render(
<div>
<input type="text" data-testid="input" />
<p>{text}</p>
</div>
);
});
});
Стало:
import '@testing-library/jest-dom';
import {
render, renderHook, act
} from '@testing-library/react';
import React, { useState } from 'react';
describe('useInputChange', () => {
it('1', () => {
const { result } = renderHook(() => useState(''));
const [text, setText] = result.current;
act(() => setText('123123'));
expect(result.current[0]).toBe('123123');
render(
<div>
<input type="text" data-testid="input" />
<p>{text}</p>
</div>
);
});
});