首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jest和Enzyme调用函数

使用Jest和Enzyme调用函数
EN

Stack Overflow用户
提问于 2019-12-04 05:05:14
回答 2查看 576关注 0票数 1

我正在使用Jest和酶来测试React组件。我正在尝试在提交表单时测试表单验证规则。测试需要涵盖此函数的所有可能情况

代码语言:javascript
复制
  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();
    }
  };

这个函数非常简单,createPasswordconfirmPassword是两个不同输入域的值。当提交表单并调用此函数时,我将在不同的条件下测试密码。如果密码不够强,则调用setPassValidationError挂钩并更新状态变量。

我目前正在尝试使用短于8个字符的密码来测试该功能。

代码语言:javascript
复制
it("passwords must be 8 char long", () => {
  const wrapper = mount(<NoAuthPasswordChange />);
  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 submitButton = wrapper.find("#submit-button");
  submitButton.simulate("click");
  expect(wrapper.find("#password-validation-error").text()).toContain(
    "*Passwords must be at least 8 characters long!"
  );
});

Jest告诉我找不到#password-validation-error (期望找到1个节点,找到0个)。现在,只有当passValidationError有数据时,才会呈现代码的这一特定部分。

代码语言:javascript
复制
{passValidationError ? (
   <h2
     className={styles.passwordError}
     id="password-validation-error"
    >
    {passValidationError}
    </h2>
  ) : null}

我不确定我的测试中是否只有一个简单的bug,或者是否需要执行更高级的操作才能使用Jest并让函数调用钩子更新。

编辑:我开始怀疑handleSubmit函数所需的event参数是否由于Jest调用该函数而有问题。

EN

回答 2

Stack Overflow用户

发布于 2019-12-04 16:11:26

这可能是由于没有更新组件本身造成的。您是否尝试过强制重新呈现您的包装器:https://airbnb.io/enzyme/docs/api/ShallowWrapper/update.html https://airbnb.io/enzyme/docs/api/ReactWrapper/update.html

票数 0
EN

Stack Overflow用户

发布于 2019-12-05 01:04:00

我已经找到了我的问题的解决方案。测试需要在表单元素本身上调用表单提交,而不是通过单击按钮。因此,我需要在我的表单元素上模拟submitButton.simulate("click"),而不是提交。我不确定为什么这个解决方案可以工作,而发布的代码却不能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59165326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档