Formik,开玩笑,是的:如何测试验证?

时间:2019-04-29 10:03:42

标签: jestjs formik 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道具日志:

{ 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,

2 个答案:

答案 0 :(得分:1)

没有看到您的组件,我不确定是怎么回事。这可能无法正常工作:

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

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

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

但是,如果这不能解决您的问题,我举了一个完整的例子,您可以看看here

答案 1 :(得分:0)

您可以直接在验证架构上验证表单值。

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