Я пытаюсь написать модульный тест, чтобы убедиться, что мой компонент для изменения пароля пользователя вызывает правильные функции внутри onSubmit
при отправке формы. Есть несколько других тестов, использующих тот же метод, что и этот, и все они проходят и дают одну и ту же ошибку.
Вот один из тестов:
import { act } from "react-dom/test-utils";
it("should render an Alert component if password and confirmPassword do not match", async () => {
global.scrollTo = jest.fn();
const wrapper = mount(
<Provider store={reduxStore}>
<Router>
<ChangePassword />
</Router>
</Provider>
);
pwFuncs.checkCurrentPassword = jest.fn(() => true);
pwFuncs.comparePW = jest.fn(() => false);
const fakeEvent = {
preventDefault: () => console.log("Prevent default..."),
};
wrapper
.find("input")
.at(0)
.simulate("change", {
target: { name: "currentPassword", value: "password1234" },
});
wrapper
.find("input")
.at(1)
.simulate("change", {
target: { name: "newPassword", value: "1234drowssap" },
});
wrapper
.find("input")
.at(2)
.simulate("change", {
target: { name: "confirmPassword", value: "password4321" },
});
await act(async () => {
wrapper.find("form").simulate("submit", fakeEvent);
});
expect(pwFuncs.checkCurrentPassword).toBeCalled();
expect(pwFuncs.comparePW).toBeCalled();
expect(wrapper.find(Alert).length).toEqual(1);
});
Тест пройден, поэтому я не У меня нет проблем с реализацией, но функция act()
вызывает у меня проблемы.
Вот ошибка:
console.error node_modules/react-test-renderer/cjs/react-test-renderer.development.js:131
Warning: It looks like you're using the wrong act() around your test interactions.
Be sure to use the matching version of act() corresponding to your renderer:
// for react-dom:
import {act} from 'react-dom/test-utils';
// ...
act(() => ...);
// for react-test-renderer:
import TestRenderer from 'react-test-renderer';
const {act} = TestRenderer;
// ...
act(() => ...);
in ConnectFunction (at ChangePassword.js:191)
in form (at ChangePassword.js:131)
in div (at ChangePassword.js:130)
in section (at ChangePassword.js:125)
in main (at ChangePassword.js:124)
in ChangePassword (created by Context.Consumer)
in withRouter(ChangePassword) (created by ConnectFunction)
in ConnectFunction (at ChangePassword.test.js:51)
in Router (created by MemoryRouter)
in MemoryRouter (at ChangePassword.test.js:50)
in Provider (at ChangePassword.test.js:49)
Во-первых, в документации Enzyme говорится, что мне даже не нужно заключать свои функции обновления состояния в act()
, потому что функция mount
делает это автоматически (Я использую React v16.12.0), но без него тестовый набор не запускается, говоря, что требуется act()
.
From https://github.com/enzymejs/enzyme#reacttestutilsact -wrap
Если вы используете React 16.8+ и .mount (), Enzyme обернет apis, включая .simulate (), .setProps (), .setContext (), .invoke () с ReactTestUtils.act (), поэтому вам не нужно вручную оборачивать его.
и, во-вторых, я пробовал использовать:
import TestRenderer from 'react-test-rendrer';
const { app } = TestRenderer;
, но он дает точно такую же ошибку.
Я не понимаю, почему появляется ошибка, ведь все тесты все равно проходят. Довольно сложно найти в Интернете какую-либо информацию об ошибках с act()
, поэтому, если бы кто-нибудь мог пролить свет на это, это было бы здорово.