使用 Jest 和酶反应输入 onchange 模拟不更新值
React input onchange simulation not updating value using Jest and enzyme
我有一个功能组件如下
const Input = () => {
const [value, updateValue] = useState("");
return (
<input
type="text"
id="input"
value={value}
onChange={(e) => {
updateValue(e.target.value);
}}
/>
);
};
export default Input;
并进行如下测试
const event = { target: { value: "Q" } };
input.simulate("change", event);
expect(input.prop("value")).toBe("Q");
问题是事件的模拟没有更新状态。
我也尝试了 wrapper.update() 但它不起作用。
你可以运行测试here
组件更新后,您的 input
变量仍然指向旧包装器。
包装器(根包装器除外)是不可变的,因此您需要再次 .find()
元素。
所以如果你
const event = { target: { value: "Q" } };
input.simulate("change", event);
expect(wrapper.find("input").prop("value")).toBe("Q");
你会通过的。
PS 可能在使用 Enzyme 进行测试时始终避免使用中间变量更安全。
对于那些像@NishamMahsin 的情况一样获得多个输入的人。
我遇到了同样的问题,并从 wrapper not updated after simulate('change'). #1999
找到了可行的解决方案
简而言之:
.simulate('change', {target: {name: 'inputFirstName', value: 'value'}})
我花了很长时间在这上面,所以希望它能帮助这里的人...
我有一个功能组件如下
const Input = () => {
const [value, updateValue] = useState("");
return (
<input
type="text"
id="input"
value={value}
onChange={(e) => {
updateValue(e.target.value);
}}
/>
);
};
export default Input;
并进行如下测试
const event = { target: { value: "Q" } };
input.simulate("change", event);
expect(input.prop("value")).toBe("Q");
问题是事件的模拟没有更新状态。 我也尝试了 wrapper.update() 但它不起作用。
你可以运行测试here
组件更新后,您的 input
变量仍然指向旧包装器。
包装器(根包装器除外)是不可变的,因此您需要再次 .find()
元素。
所以如果你
const event = { target: { value: "Q" } };
input.simulate("change", event);
expect(wrapper.find("input").prop("value")).toBe("Q");
你会通过的。
PS 可能在使用 Enzyme 进行测试时始终避免使用中间变量更安全。
对于那些像@NishamMahsin 的情况一样获得多个输入的人。 我遇到了同样的问题,并从 wrapper not updated after simulate('change'). #1999
找到了可行的解决方案简而言之:
.simulate('change', {target: {name: 'inputFirstName', value: 'value'}})
我花了很长时间在这上面,所以希望它能帮助这里的人...