[英]react-hook-form's formstate.errors weird behavior in jest test
我想對 onBlur 進行驗證。 但是當我開玩笑地測試它時,錯誤消息不會出現在第一個測試子句的第一個 onblur 中。 但是,它出現在第二個測試子句的第二個 onblur 中。
這里我展示了第一個和第二個子句的 DOM,我們可以看到錯誤消息顯示在第二個 onblur 之后的第二個子句中。
如何使錯誤消息顯示在第一個測試子句的第一個 onblur 中?
反應文件
import React from 'react';
import { useForm } from 'react-hook-form';
import { string, object } from 'yup';
import { yupResolver } from '@hookform/resolvers/yup';
interface TestingProps {
fullname: string;
}
const TestingPage: React.FC = () => {
const schema = object().shape({
fullname: string().required('fullname is required!')
});
const {
register,
handleSubmit,
formState: { errors }
} = useForm<TestingProps>({
resolver: yupResolver(schema),
mode: 'onBlur'
});
const submit = () => {};
return (
<div>
<form onSubmit={handleSubmit(submit)}>
<input className="testing" {...register('fullname')} />
</form>
{errors?.fullname && <p>{errors.fullname.message}</p>}
<input type="submit" />
</div>
);
};
export default TestingPage;
笑話測試文件
import Enzyme, { mount } from 'enzyme';
import Adapter from '@wojtekmaj/enzyme-adapter-react-17';
import TestingPage from './TermsAndConditions';
Enzyme.configure({ adapter: new Adapter() });
describe('Testing page test', () => {
let wrapper: any;
test('first attempt to show error message onblur', () => {
wrapper = mount(<TestingPage />);
wrapper.find('.testing').simulate('focus');
wrapper.find('.testing').simulate('blur');
console.log(wrapper.debug());
});
test('second attempt to show error message onblur', () => {
wrapper.find('.testing').simulate('blur');
console.log(wrapper.debug());
});
});
您只需要在測試斷言之前await
,因為 react-hook-form 驗證和提交是異步的。 使用刷新承諾,例如
function flushPromises() {
return new Promise(resolve => setImmediate(resolve));
}
test('first attempt to show error message onblur', async () => {
wrapper = mount(<TestingPage />);
wrapper.find('.testing').simulate('focus');
wrapper.find('.testing').simulate('blur');
await flushPromises();
console.log(wrapper.debug());
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.