Вот песочница кода, которая содержит тест, имитирующий эту проблему. Тест в этой изолированной программной среде кода не проходит, как описано в этом вопросе: https://codesandbox.io/s/react-jest-and-enzyme-testing-c7vng
Я пытаюсь проверить значение <input />
, которое обновляется внутри useEffect
. Это код из песочницы кода, которая является упрощенной версией того, что я пытаюсь сделать в проекте.
import React, { useEffect, useRef, useState } from "react";
const App = () => {
const [count, setCount] = useState(0);
useEffect(() => {
ref.current.value = "";
console.log(typeof ref.current.value);
}, [count]);
const ref = useRef(null);
const handleClick = () => {
setCount(count + 1);
console.log(count);
};
return (
<div>
<input ref={ref} type="text" />
<button onClick={handleClick}>click me</button>
</div>
);
};
export default App;
Я использую useRef
, чтобы установить значение <input />
.
useEffect
вызывается при нажатии <button />
. <button />
обновляет useState
count
. useEffect
наблюдает за обновлениями count
, и его вызывают как побочный эффект.
В useEffect
я устанавливаю ref.current.value
в пустую строку, а затем записываю typeof
это значение, чтобы убедиться, что это строка.
В тесте я пытаюсь смоделировать это поведение:
describe("App", () => {
const wrapper = mount(<App />);
wrapper.find("input").props().value = "hello";
act(() =>
wrapper
.find("button")
.props()
.onClick()
);
console.log(wrapper.find("input").debug());
wrapper.update();
console.log(wrapper.find("input").debug());
expect(wrapper.find("input").length).toBe(1);
expect(wrapper.find("input").props().value).toBe("hello");
});
Я установил value
prop в 'hello'
. Затем я вызываю <button />
onClick
опору, эффективно нажимая на нее. Затем я звоню wrapper.update()
, и я также debug()
записываю <input />
до и после update()
.
До, update()
, <input />
имеет value
реквизит, содержащий 'hello'
. После update()
, <input />
не имеет value
проп. Это приводит к сбою теста, говоря, что <input />
value
не определен после обновления.
Разве значение ввода не должно быть ''
после обновления?