[英]Mocking react-router-dom useHistory and other hooks with jest
[英]Mocking react-router-dom hooks using jest is not working
我正在使用 Enzyme 的淺層方法來測試一個組件,該組件使用useParams
掛鈎從 URL 參數中獲取 ID。
我試圖模擬useParams
鈎子,使其不調用實際方法,但它不起作用。 我仍然收到TypeError: Cannot read property 'match' of undefined
,所以它調用實際的useParams
,而不是我的模擬。
我的組件:
import React from 'react';
import { useParams } from 'react-router-dom';
export default () => {
const { id } = useParams();
return <div>{id}</div>;
};
測試:
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import React from 'react';
import Header from './header';
import { shallow } from 'enzyme';
Enzyme.configure({ adapter: new Adapter() });
describe('<Header />', () => {
jest.mock('react-router-dom', () => ({
useParams: jest.fn().mockReturnValue({ id: '123' }),
}));
it('renders', () => {
const wrapper = shallow(<Header />);
expect(wrapper).toBeTruthy();
});
});
謝謝!
我不知道為什么,在 react-router 庫的文檔中也找不到它,但是在測試和實現中將react-router-dom
更改為react-router
對我有用。
所以它變成了這樣:
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import React from 'react';
import Header from './header';
import { shallow } from 'enzyme';
Enzyme.configure({ adapter: new Adapter() });
describe('<Header />', () => {
jest.mock('react-router', () => ({
useParams: jest.fn().mockReturnValue({ id: '123' }),
}));
it('renders', () => {
const wrapper = shallow(<Header />);
expect(wrapper).toBeTruthy();
});
});
我試過這個模擬,但它對我不起作用。 錯誤:無法讀取未定義的屬性“匹配”。 似乎該組件不在路由器內部,因此它無法使用參數模擬匹配。 它對我有用:
import { MemoryRouter, Route } from 'react-router-dom';
const RenderWithRouter = ({ children }) => (
<MemoryRouter initialEntries={['uri/Ineed']}>
<Route path="route/Ineed/:paramId">{children}</Route>
</MemoryRouter>
);
const tf = new TestFramework();
describe('<MyComponent />', () => {
tf.init({ title: 'Some test' }, props =>
shallow(
<RenderWithRouter>
<MyComponent {...props} />
</RenderWithRouter>
)
);
it('Some description', () => {
const wrapper = tf.render().html();
expect(wrapper).toContain('something');
});
});
我遇到了類似的問題,我是這樣解決的:
import { Route, Router } from "react-router-dom";
import { createMemoryHistory } from "history";
const renderWithRouter = (component) => {
const history = createMemoryHistory({
initialEntries: ["/part1/idValue1/part2/idValue2/part3"],
});
const Wrapper = ({ children }) => (
<Router history={history}>
<Route path="/part1/:id1/part2/:id2/part3">{children}</Route>
</Router>
);
return {
...render(component, { wrapper: Wrapper }),
history,
};
};
describe("test", () => {
it("test desc", async () => {
const { getByText } = renderWithRouter(<MyComponent/>);
expect(getByText("idValue1")).toBeTruthy();
});
});
對我來說 mocking react-router-dom 修復問題:
jest.mock('react-router-dom', () => ({
useParams: jest.fn().mockReturnValue({ nifUuid: 'nif123' }),
useHistory: jest.fn()
}));
這對我來說可以模擬 useParams 並更改同一文件中每個單元測試的值:
import React from "react";
import { render } from "@testing-library/react";
import Router from "react-router-dom";
import Component from "./Component";
jest.mock("react-router-dom", () => ({
...jest.requireActual("react-router-dom"),
useParams: jest.fn(),
}));
const createWrapper = () => {
return render(<Cases />);
};
describe("Component Page", () => {
describe("Rendering", () => {
it("should render cases container", () => {
jest.spyOn(Router, 'useParams').mockReturnValue({ id: '1234' })
const wrapper = createWrapper();
expect(wrapper).toMatchSnapshot();
});
it("should render details container", () => {
jest.spyOn(Router, 'useParams').mockReturnValue({ id: '5678' })
const wrapper = createWrapper();
expect(wrapper).toMatchSnapshot();
});
});
});
只需在 describe() 之外將useParams
聲明為jest.fn()
) ,然后在每個單元測試中使用jest.spyOn
更改其值
我遇到過同樣的問題。 我像這樣嘲笑 useParams :
jest.mock('react-router-dom', () => {
return {
useParams: () => ({
id: '123'
})
}
})
我遇到過同樣的問題。 從“@testing-library/react”調用“清理”function 可以幫助我:
import { cleanup } from '@testing-library/react';
afterEach(() => {
cleanup();
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.