Я бы избегал использования window
истории и вместо этого использовал бы react-router-dom
для МОР.Кроме того, вместо использования анонимной функции вы можете использовать класс PureComponent
(он похож на класс Component
, но не обновляет state
) с функцией класса method
.
Рабочий пример : https://codesandbox.io/s/j3qo6ppxqy (в этом примере используется react-router-dom
и проводится тестирование integration
и unit
- см. Вкладку tests
в нижней частистраница для запуска тестов и поиска папок __test__
для просмотра кода)
компоненты / NotFound / notfound.js
import React, { PureComponent } from "react";
import { Button } from "antd";
export default class NotFound extends PureComponent {
handlePageBack = () => this.props.history.push("/");
render = () => (
<div className="notfound">
<h1>404 - Not Found!</h1>
<Button type="default" onClick={this.handlePageBack}>
Go Back
</Button>
</div>
);
}
компоненты /NotFound / __ tests __ / notfound.test.js (как уже упоминалось здесь , при желании вы также можете протестировать метод класса)
import React from "react";
import { shallowComponent } from "../../../tests/utils";
import NotFound from "../notfound";
const mockGoBack = jest.fn();
const initialProps = {
history: {
goBack: mockGoBack
}
};
/*
the shallowComponent function below is a custom function in "tests/utils/index.js" that
simplifies shallow mounting a component with props and state
*/
const wrapper = shallowComponent(<NotFound {...initialProps} />);
describe("Not Found", () => {
it("renders without errors", () => {
const notfoundComponent = wrapper.find("div.notfound");
expect(notfoundComponent).toHaveLength(1);
});
it("pushes back a page when Go Back button is clicked", () => {
wrapper.find("Button").simulate("click");
expect(mockGoBack).toHaveBeenCalled();
});
});