使用 react-testing-library 进行测试时如何模拟 react-hook-form 的元素?

Posted

技术标签:

【中文标题】使用 react-testing-library 进行测试时如何模拟 react-hook-form 的元素?【英文标题】:How to mock the elements of react-hook-form when testing with react-testing-library? 【发布时间】:2022-01-23 06:52:40 【问题描述】:

拥有一个使用 react-hook-form 的基本组件:

const handleSubmit, 重置, 控制 = useForm( 解析器:yupResolver(schema) );

...

  <MyComponent
    title='title'
    open=isOpened
    control=control
  />

这个组件有 3 个 props,title - 一个字符串,open - 一个函数,control - 不知道是什么,都是必填项。

因此,在为它编写测试时,我陷入了困境:

import  render  from '@testing-library/react';

import '@testing-library/jest-dom';
import MyComponent from './my-component';

describe('MyComponent', () => 
  const title = 'title';
  it('should render successfully', () => 
    const  baseElement, getByText  = render(
      <TaskModal
        title=title
        open=jest.fn()
        control= // what should be written here?
      />
    );
    expect(baseElement).toBeTruthy();
    expect(getByText(title)).toBeTruthy();
  );

control 怎么能被这个测试模拟?

【问题讨论】:

control 来自哪里?您至少应该提供控制变量在何处定义或从哪个模块导入 【参考方案1】:

control 来自useForm

const control = useForm();

使用ControlleruseController 时需要控制 文档:https://react-hook-form.com/api/usecontroller

我想TaskModal 组件在一个表单中。我建议将表单放在 modal 中,这样会更容易测试,否则您可以使用表单包装您的组件(TaskModal)以进行测试。

【讨论】:

这里是模态的完整代码:pastebin.com/khvn3Vq5,这里是测试:pastebin.com/JFfJkNRT,我已经添加了你建议的更改,但它仍然失败,返回此错误:无效挂钩称呼。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本同一个应用reactjs.org/link/invalid-hook-call 请阅读文档以了解如何使用 react-hook-form 编写测试:react-hook-form.com/advanced-usage#TestingForm

以上是关于使用 react-testing-library 进行测试时如何模拟 react-hook-form 的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Testing-Library 测试 mapDispatchToProps?

如何使用 Jest 和 react-testing-library 测试 useRef?

react-testing-library - 屏幕与渲染查询

如何使用 react-testing-library 测试由其他组件组成的组件?

使用 react-testing-library 时如何测试组件是不是使用正确的道具呈现?

使用 react-testing-library 时找不到带有文本的元素:“myText”错误