Я хочу написать тест с использованием Jest и Enzyme, который тестирует компонент, имеющий прослушиватель событий, так что когда происходит событие mousedown вне заданного html-элемента, происходит изменение (в этом примере значение состояния переключается),Я использую jest для того, чтобы смоделировать прослушиватель событий и имитировать событие mousedown, однако при попытке запустить этот тест я получаю следующее сообщение об ошибке:
TypeError: Не удалось выполнить «contains»на «Узле»: параметр 1 не относится к типу «Узел».
Очевидно, я думаю, что <div />
- это не то значение, которое я должен предоставить, когда я моделирую событие mousedown с map.mousedown({ target: <section /> });
,Как правильно смоделировать событие mousedown, которое происходит за пределами моего компонента? Вы можете увидеть код ниже. Спасибо!
sampleComponent.jsx:
import * as React from 'react';
const SampleComponent = () => {
const [state, setState] = React.useState(false);
const ref = React.useRef(null);
const handleClickOutside = (event) => {
if (
!ref.current.contains(event.target)
) {
setState(true);
}
};
React.useEffect(() => {
document.addEventListener('mousedown', handleClickOutside);
return () => document.removeEventListener('mousedown', handleClickOutside);
});
return (
<div
id="sample-div"
ref={ref}
>
{`State value is: ${state}`}
</div>
);
};
export default SampleComponent;
sampleComponent.test.jsx:
import * as React from 'react';
import { mount } from 'enzyme';
import SampleComponent from './sampleComponent';
const setup = () => mount(<SampleComponent />);
test('testing mousedown', () => {
const map = {};
document.addEventListener = jest.fn((event, callback) => {
map[event] = callback;
});
const wrapper = setup();
expect(wrapper.find('#sample-div').text()).toBe('State value is: false');
map.mousedown({ target: <section /> });
expect(wrapper.find('#sample-div').text()).toBe('State value is: true');
});