【发布时间】:2020-03-21 19:41:29
【问题描述】:
这是一个包含模拟此问题的测试的代码沙箱。此代码沙箱中的测试失败,如以下问题所述:https://codesandbox.io/s/react-jest-and-enzyme-testing-c7vng
我正在尝试测试在 useEffect 中更新的 <input /> 的值。这是代码沙箱中的代码,它是我在项目中尝试做的事情的简化版本。
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 />的值。
点击<button /> 时会调用useEffect。 <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 属性设置为'hello'。然后我调用<button /> onClick 道具,有效地点击它。然后我打电话给wrapper.update(),我也在debug() 之前和之后记录<input /> update()。
在update() 之前,<input /> 有一个包含'hello' 的value 属性。在 update() 之后,<input /> 没有 value 属性。这会导致测试失败,说<input />value更新后未定义。
更新后输入的值不应该是''吗?
【问题讨论】:
标签: javascript reactjs jestjs enzyme