3

我找不到测试表单 yup 验证的方法:

it('displays error on submit if name is empty', async () => {
    const wrapper = mount(<MyFormik/>)
    const getForm = () => wrapper.find('form')

    wrapper.find('input[name="name"]').simulate('change', {
      persist: () => {},
      target: {
        name: 'name',
        value: ''
      }
    })

    wrapper
      .find('MyInnerForm')
      .props()
      .submitForm()


    await wait(0) // await next tick or even 1s...
    wrapper.update()

    expect(
      wrapper
      .update()
      .find('.error')
      .exists()
    )
    .toBeTruthy() // FALSE!
  })

无论我是否在提交后等待,更新包装器错误道具始终为空。

这里的解决方案对我不起作用:

https://github.com/jaredpalmer/formik/issues/1146

https://github.com/jaredpalmer/formik/issues/110

看起来包装器不会更新

这是提交后formik props的日志:

{ errors: {},
         label: '',
         name: 'name',
         type: 'text',
         values: { name: '' },
         touched: { name: true },
         isValidating: false,
         status: undefined,
         initialValues: { name: '' },
         validateOnChange: true,
         validateOnBlur: true } }
         ...

         submitCount: 1,
         isValid: false,
4

2 回答 2

5

没有看到你的组件,我不完全确定出了什么问题。这可能不起作用:

wrapper
      .find('MyInnerForm')
      .props()
      .submitForm()

如果您的组件MyInnerForm包含 Formik 表单调用submitForm(),则不会导致 Formik 的验证运行。相反,我会做这样的事情:

wrapper.find("form").simulate("submit");

但是,如果这不能解决您的问题,我制作了一个完整的示例,您可以在这里查看

于 2019-04-30T09:58:24.473 回答
5

您可以直接在验证模式上验证表单值。

const yup = require('yup')

const contactSchema = yup.object({
  name: yup.string()
    .required(),
  age: yup.number()
    .required()
    .positive()
    .integer()
})

const errors = await contactSchema.validate({
  name: 'Kenneth',
  age: -35.5
}).catch(function(err) {
  return err
});

console.log("errors", errors);

https://runkit.com/kluplau/5defa8cd122cf6001a3034c7

于 2019-12-10T14:25:45.737 回答