Я пытаюсь написать модульные тесты для довольно простой панели вкладок, которую я сделал с помощью Material ui.
По сути, я просто хочу проверить, была ли вызвана функция handleTabChange
при нажатии на вкладку. и что было передано правильное значение. Я также хотел проверить, работает ли маршрутизация, т. е. если вы нажали кнопку «Feed», вы получили /feed
, но я также не смог заставить это работать.
TabBar.jsx
import React, { useState } from 'react';
import { Tabs, Tab } from '@material-ui/core';
import { withRouter } from 'react-router-dom';
import { object } from 'prop-types';
import { tabToPathnameMap, pathnameToTabMap } from '../../constants/constants';
const TabBar = (props) => {
const { history, location } = props;
const { pathname } = location;
const handleTabChange = (e, newValue) => {
setCurrentTab(newValue);
history.push(tabToPathnameMap[newValue]);
};
const [currentTab, setCurrentTab] = useState(
pathnameToTabMap[pathname] ? pathnameToTabMap[pathname] : false
);
return (
<Tabs
value={currentTab}
onChange={(e, newValue) => handleTabChange(e, newValue)}
centered
>
<Tab label="Feed" tabBar-tab-testId="Feed" />
<Tab label="Fork" tabBar-tab-testId="Fork" />
<Tab label="Favs" tabBar-tab-testId="Favs" />
</Tabs>
);
};
TabBar.propTypes = {
history: object,
location: object
};
export default withRouter(TabBar);
TabBar.test.jsx
import React from 'react';
import { mount } from 'enzyme';
import { MemoryRouter } from 'react-router-dom';
import TestComponentWrapper from '../../TestComponentWrapper';
import TabBar from '../../../Components/TabBar/TabBar';
describe('TabBar', () => {
it('should move to /fork when the fork tab is clicked', () => {
const wrapper = mount(
<TestComponentWrapper>
<MemoryRouter initialEntries={['/']}>
<TabBar />
</MemoryRouter>
</TestComponentWrapper>
);
const spy = jest.spyOn(wrapper.instance(), 'handleTabChange');
expect(spy).toHaveBeenCalledTimes(0);
wrapper.find('[tabBar-tab-testId="Fork"]').hostNodes().simulate('click');
expect(spy).toHaveBeenCalledTimes(1);
});
});
Прямо сейчас я получаю ошибку, что wrapper.instance()
возвращает ноль - и я только что узнал, что вы не можете использовать его с функциональными компонентами без сохранения состояния.
Кто-нибудь знает, как я могу проверить функцию / и / или изменение пути при нажатии на одну из этих вкладок?