reactjs - Material-UI 表单和 React 测试库所需的表单字段

标签 reactjs forms material-ui react-testing-library

我有一个想要测试的 MUI 表单。所有表单字段都是必需的,我想使用 @testing-library/react 进行测试

表格如下:

<form id='xml-form' onSubmit={handleSubmit}>
      <div
        <FormControl required={true}>
          <InputLabel required={true}>Name</InputLabel>
          <Input
            id='firstName'
            data-testid='required-firstName'
            required={true}
          />
        </FormControl>
      </div>
      <div>
        <TextField
          id='lastName'
          data-testid='required-lastName'
          required
          label='Last Name'
          style={{ marginBottom: 15 }}
        />
      </div>
      <Button
        type='submit'
        form='xml-form'
        color='primary'
        variant='contained'
        style={{ marginBottom: 15 }}
      >
        Generate XML
      </Button>
    </form>

这是我测试它的方法:

test('All fields are required', () => {
  render(<XMLForm />);
    expect(
      getByTestId(document.documentElement, 'required-firstName')
    ).toBeRequired();
  expect(
    getByTestId(document.documentElement, 'required-lastName')
  ).toBeRequired();
});

测试在第一个表单字段处失败。不管我是否使用 <TextField /><FormControl /> ,渲染的 DOM 元素似乎没有必需的字段,我不知道为什么。

Received element is not required:
      <div class="MuiInputBase-root MuiInput-root MuiInput-underline MuiInputBase-formControl MuiInput-formControl" data-testid="required-firstName" required="" />

       7 |     expect(
       8 |       getByTestId(document.documentElement, 'required-firstName')
    >  9 |     ).toBeRequired();
         |       ^
      10 |   expect(
      11 |     getByTestId(document.documentElement, 'required-lastName')
      12 |   ).toBeRequired();

最佳答案

您需要通过data-testidinputProps当使用 <Input /> 时或 <TextField /> :

<form id='xml-form' onSubmit={handleSubmit}>
  <div
    <FormControl required={true}>
      <InputLabel required={true}>Name</InputLabel>
      <Input
        id='firstName'
        inputProps={{ 'data-testid': 'required-firstName' }}
        required={true}
      />
    </FormControl>
  </div>
  <div>
    <TextField
      id='lastName'
      inputProps={{ 'data-testid': 'required-lastName' }}
      required
      label='Last Name'
      style={{ marginBottom: 15 }}
    />
  </div>
  <Button
    type='submit'
    form='xml-form'
    color='primary'
    variant='contained'
    style={{ marginBottom: 15 }}
  >
    Generate XML
  </Button>
</form>

或者,我相信您可以使用 getByLabelText() 询问。对于您感兴趣的两个元素,它将是:

test('All fields are required', () => {
  render(<XMLForm />);
  expect(
    getByLabelText(document.documentElement, 'Name')
  ).toBeRequired();
  expect(
    getByLabelText(document.documentElement, 'Last Name')
  ).toBeRequired();
});

关于reactjs - Material-UI 表单和 React 测试库所需的表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65981875/

相关文章:

javascript - 如何将D3js图表放置在网格系统中?

css - Bootstrap 样式表单内联

mysql - 用 SQL 形成数据库

javascript - 如何为 MUI DataGrid 中的每一行添加一个序列号?

node.js - 开始使用 material-ui

javascript - 如何让 Material-UI 的 <TextField/> 像 ReactJS 中的 &lt;input/> 一样使用 ref ='' 正确返回?

reactjs - jsx中的三元将selected属性添加到选项

javascript 文件中的 css 自动完成(atom 编辑器)

json - 什么是 axios.defaults.headers.post 'content-type' = 'application/json'

php - Symfony2 表单中实体字段类型的附加属性