У меня были проблемы с получением 100% тестового покрытия для одной из моих кнопок (функциональные компоненты A React). По сути, при нажатии она выполняет некоторый код, а затем также вызывает другой метод из этого onClick
, называемый * 1002.*.Этот метод найдет все кнопки в приложении и удалит класс.Это упреждающее поведение, так что только одна кнопка за раз может быть active
.
. До сих пор я проверял щелчок, используя .simulate
, передавая имитированный domElement
.А затем проверьте, что метод domElement.classList.add
вызывается с 'active'
.
Очевидно, что это DOM-центрированная операция, и мне очень трудно протестировать метод resetButtons
, который находится внутри компонента.особенно учитывая, что у него нет никаких методов.
Я попытался определить метод resetButtons
вне компонента, а затем экспортировал его, чтобы его можно было импортировать с помощью jest-теста.Однако я не смог протестировать метод, так как кажется, что он должен быть шпионом или поддельным, а не сам метод.(Matcher error: received value must be a mock or spy function
)
Вот реагирующий функциональный компонент:
import React from 'react';
import PropTypes from 'prop-types';
import classes from './MainButton.module.scss';
const MainButton = (props) => {
const resetButtons = () => {
const elements = document.getElementsByClassName('mainButton');
for (let i = 0; i < elements.length; i += 1) {
elements[i].classList.remove('active');
}
};
const handleClick = (event) => {
if (!event.target.classList.contains('active')) {
resetButtons();
event.target.classList.add('active');
props.setVisualState(props.className.split('-')[0]);
}
};
return (
<button
onClick={handleClick}
type="button"
className={`${classes.mainButton} ${props.className}`}
>
{props.children}
</button>
);
};
MainButton.propTypes = {
children: PropTypes.node,
className: PropTypes.string,
setVisualState: PropTypes.func.isRequired,
};
MainButton.defaultProps = {
children: 'Button',
className: '',
};
export default MainButton;
Вот тест
import React from 'react';
import { shallow } from 'enzyme';
import MainButton from './MainButton';
describe('MainButton', () => {
const domElement = { classList: { contains: jest.fn(), remove: jest.fn(), add: jest.fn() } };
const setVisualStateMock = jest.fn();
const mainButton = shallow(<MainButton setVisualState={setVisualStateMock} />);
it(' is rendered properly', () => {
expect(mainButton).toMatchSnapshot();
});
describe('when clicked', () => {
beforeEach(() => {
mainButton.find('button').simulate('click', { target: domElement });
});
it('it runs `classlist.add` to assign `active` class', () => {
expect(domElement.classList.add).toHaveBeenCalledWith('active');
});
it('it runs set visual state to update `Allergen` container `state`', () => {
expect(setVisualStateMock).toHaveBeenCalled();
});
});
});
В настоящее время отчет о покрытии сообщает о 92% покрытии,но ветвь в 50, и линия, которая вызывает проблему, находится в строке 9 (строка elements[i].classList.remove('active');
.
Я знаю, что на 90% я, вероятно, должен просто идти дальше, но это то, чем я хочу бытьв состоянии разобраться. Чувствую, что обдумать это сделает меня лучше.
Надеюсь, вы, ребята, можете помочь!