reactjs - 使用 react-hook-form 时无法测试 onSubmit
问题描述
在编写单元测试用例以检查提交函数是否被调用时,我遇到了一个问题。我面临的问题与以下问题类似: https ://spectrum.chat/react-hook-form/help/solved-testing-the-onsubmit~364b8d79-c2f2-4d1c-a3ae-d56fed134128
但是,我使用的代码结构略有不同,因为我没有直接返回“表单组件”,而是返回包装在“FormContext”中的“表单组件”。
export const CreateNewGame = () => {
const [diceType, setDiceType] = useState(null);
const { handleSubmit, register, errors, reset } = useForm({
mode: 'onChange',
});
const submit = (data) => {
console.log(data);
reset({
title: '',
gameType: '',
diceNumber: '',
});
};
const dataSource = [
'Settlers',
'Catan',
'Pandemic',
'Ticket to Ride',
'Risk',
'Yatzy',
'Dungeon and Dragons',
];
useEffect(() => {}, [diceType]);
return (
<FormContext>
<Form onSubmit={handleSubmit(submit)} data-testid='form'>
<Input
type='text'
name='title'
label='Titel'
ref={register({ required: true })}
error={errors.title}
/>
<InputWithDatalist
type='text'
name='gameType'
label='Ange spel'
ref={register({ required: true })}
error={errors.gameType}
listArray={dataSource}
/>
<Input
type='text'
name='diceNumber'
label='Antal tärningar'
ref={register({
required: true,
pattern: { value: /^[0-9]$/, message: 'Måste vara en siffra' },
})}
error={errors.diceNumber}
/>
<DiceContainer>
<DiceButton
label='Prickar'
activeClass={diceType === 'dots' ? true : false}
icon='dice-five'
onClick={() => setDiceType('dots')}
/>
<DiceButton
label='Siffror'
activeClass={diceType === 'numbers' ? true : false}
icon='dice-five'
onClick={() => setDiceType('numbers')}
/>
</DiceContainer>
<GeneralButton type='submit'>Starta spel</GeneralButton>
</Form>
</FormContext>
);
};
失败的测试如下:
it('testing', async () => {
const props = {
// props
}
const onSubmit = jest.fn();
const {
getByTestId,
} = render (
<Provider store={store}>
<FormContext>
<CreateNewGame {...props} submit={onSubmit} />
</FormContext>
</Provider>
);
const form = getByTestId('form');
fireEvent.submit(form);
expect(onSubmit).toHaveBeenCalled();
});
我得到的错误如下:
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
解决方案
在您的CreateNewGame
组件中,您将一个submit
道具传递给<CreateNewGame {...props} submit={onSubmit} />
——在您的测试中,该道具包含对jest.fn()
模拟的引用——但在组件定义本身中,该组件不接受任何道具。
推荐阅读
- python - Flask Python HTML 如果表单具有 id 按钮不会进入 multidict
- python - 我很感激有关此“IndexError:元组索引超出范围”的来源的一些反馈
- express - EJS 似乎不识别变量?
- oz - 如何为 Oz 中的列表编写长度函数?
- python - 如何在 pandas 中仅内爆(explode 的反向)非空值。使用 pandas group by 将多行合并为单行
- python - 负前瞻以匹配不在列表中的单词
- docker - ingress-nginx:客户端向 https 服务器发送 http 请求
- python - _tkinter.TclError: 错误# args: 应该是“.!entry4 插入索引文本”
- amazon-web-services - terraform 中的无效计数参数
- php - 为什么 PHP 过滤器会失败?