【发布时间】:2020-03-29 13:42:14
【问题描述】:
我在尝试测试 React 表单提交时遇到错误。错误显示为 TypeError: Cannot read property 'value' of undefined 。我发现其他用户也有类似问题,但我的用户是独一无二的,因为我使用的是event.target.elements,而不是event.target.value。
这是我正在测试的功能:
const handleSubmit = event => {
event.preventDefault();
const { createPassword, confirmPassword } = event.target.elements;
if (createPassword.value !== confirmPassword.value) {
setPassValidationError("*Passwords must match!");
} else if (createPassword.value.length < 8) {
setPassValidationError("*Passwords must be at least 8 characters long!");
} else if (createPassword.value.search(/[A-Z]/) < 0) {
setPassValidationError(
"*Passwords must contain at least one uppercase letter!"
);
} else if (createPassword.value.search(/[!@#$%^&*]/) < 0) {
setPassValidationError(
"*Passwords must contain at least one special character!"
);
} else {
props.updatePassword({
uid: props.uid,
token: props.token,
new_password: createPassword.value
});
event.target.reset();
}
};
以下是表单中使用的输入字段:
<input id="create-password" type={passType} required />
<input id="confirm-password" type={passType} required />
现在,当我运行测试时,我希望 createPassword.value 和 confirmPassword.value 获取它们各自输入字段的模拟数据的值。这是我的测试:
it("passwords must be 8 char long", () => {
const onMock = jest.fn();
const wrapper = mount(<NoAuthPasswordChange handleSubmit={onMock} />);
const passInput = wrapper.find("#create-password");
const confirmPass = wrapper.find("#confirm-password");
passInput.simulate("change", { target: { value: "QQQQQQ" } });
confirmPass.simulate("change", { target: { value: "QQQQQQ" } });
const form = wrapper.find("#no-auth-password-change-form");
form.simulate("submit", { preventDefault: () => {} });
expect(wrapper.find("#password-validation-error").text()).toContain(
"*Passwords must be at least 8 characters long!"
);
});
我该怎么做才能使createPassword.value 存在?
【问题讨论】:
-
这段代码 sn-p 是否有效,只是测试中断?这个错误发生在哪一部分?
TypeError: Cannot read property 'value' of undefined -
@adamz4008 是的,代码有效。测试响应告诉我
value没有为createPassword.value定义。我认为这与simulate没有绑定event有关。
标签: reactjs unit-testing jestjs enzyme