Компоненты функции Test React обещают поведение с Jest,
У меня есть компонент функции React. Я передаю компоненту функцию как опору, которая возвращает обещание. Я использую эту функцию на
onClick
событие, и как только обещание выполнено, я изменяю состояние компонента. Что-то вроде:
import React, { useState } from 'react';
function myComponent({ aPromiseReturningFunction }) {
const [myState, setState] = useState('12');
const clickHandler = () => {
aPromiseReturningFunction().then(() => { setState('123') })
};
return <div onClick={ clickHandler }>{myState}</div>
}
Внутри моего теста:
const myFunc = jest.fn(() => Promise.resolve(true));
const componentWrapper = shallow(<myComponent aPromiseReturningFunction={ myFunc }/>);
componentWrapper.simulate('click');
expect(componentWrapper.text()).toEqual('123');
Очевидно, что вышеперечисленное не работает, но я не нашел ничего, что объясняло бы, как правильно проверить это. Конечно, если я изменю состояние вне обещания, тест пройдет.
Какие-либо предложения?
2 ответа
С
click
обновляет состояние после асинхронного обещания, я бы использовал act
import { act } from 'react-dom/test-utils'; // other testing libraries have similar methods that test async events
const myFunc = jest.fn(() => Promise.resolve(true));
it('updates text after onclick', () => {
const componentWrapper = shallow(<myComponent aPromiseReturningFunction={ myFunc }/>);
act(() => {
componentWrapper.simulate('click');
});
expect(componentWrapper.text()).toEqual('123');
});
Благодаря alextrastero мне в конце концов удалось прийти к решению.
Чего не хватает в ответе alextrastero, так это того, что мы должны заключить
act()
внутри async / await как:
import { act } from 'react-dom/test-utils'; // other testing libraries have similar methods that test async events
const myFunc = jest.fn(() => Promise.resolve(true));
it('updates text after onclick', async () => {
const componentWrapper = shallow(<myComponent aPromiseReturningFunction={ myFunc }/>);
await act(() => {
componentWrapper.simulate('click');
});
expect(componentWrapper.text()).toEqual('123');
});
И для того, чтобы это работало, мне также нужно было использовать
regenerator-runtime/runtime
упаковка.