首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React测试库:无法选择资料UI DatePicker按钮

React测试库:无法选择资料UI DatePicker按钮
EN

Stack Overflow用户
提问于 2020-05-22 13:45:23
回答 2查看 7.8K关注 0票数 4

我有一个React组件,它是围绕Material的KeyboardDatePicker的一个薄包装器。我正在尝试使用为其编写测试。我遇到的问题是我无法选择用来打开日历的按钮。我尝试过几个不同的问题。我还使用了debug()来确认按钮确实正在呈现。

以下是组件:

代码语言:javascript
运行
复制
import React from 'react'
import MomentUtils from '@date-io/moment'
import {
  KeyboardDatePicker,
  MuiPickersUtilsProvider,
} from '@material-ui/pickers'
import { StyledDatePickerWrap } from './style'

const DatePicker = (props) => {
  const {
    handleDateChange,
    label,
    selectedDate,
    disableFuture,
    disablePast,
    variant,
  } = props

  return (
    <StyledDatePickerWrap>
      <MuiPickersUtilsProvider utils={MomentUtils}>
        <KeyboardDatePicker
          disableFuture={disableFuture}
          disablePast={disablePast}
          label={label}
          value={selectedDate}
          variant={variant}
          onChange={handleDateChange}
          InputProps={{
            disableUnderline: true,
          }}
          KeyboardButtonProps={{
            'aria-label': 'change date',
            'data-testid': 'changeDate',
          }}
        />
      </MuiPickersUtilsProvider>
    </StyledDatePickerWrap>
  )
}

DatePicker.defaultProps = {
  variant: 'dialog',
  disableFuture: true,
  disablePast: false,
}

export default DatePicker

下面是测试规范:

代码语言:javascript
运行
复制
import React from 'react'
import { render, fireEvent } from 'Utils/test-utils'
import moment from 'moment'
import DatePicker from './DatePicker'

describe('DatePicker', () => {
  const handleDateChange = jest.fn()
  const selectedDate = moment('2020-05-21T19:25:00.000Z')

  const props = {
    handleDateChange,
    selectedDate,
  }

  const { debug, queryByDisplayValue, getByTestId, queryByText } = render(
    <DatePicker {...props} />
  )

  debug()

  it('should render the correct Date', () => {
    expect(queryByDisplayValue(/May 21st/)).not.toBeNull()
  })

  it('should render the "change date" button', () => {
    // why can't I select this button?
    // I've also tried by  getByLabelText('change date') and even container.querySelector('button')
    const button = getByTestId('changeDate')
    fireEvent.click(button)
    expect(queryByText('Thu, May 21')).not.toBeNull()
  })
})

下面是测试错误:

代码语言:javascript
运行
复制
 ● DatePicker › should render the "change date" button

    TestingLibraryElementError: Unable to find an element by: [data-testid="changeDate"]

    <body />

      26 |     // why can't I select this button?
      27 |     // I've also tried by  getByLabelText('change date') and even container.querySelector('button')
    > 28 |     const button = getByTestId('changeDate')
         |                    ^
      29 |     fireEvent.click(button)
      30 |     expect(queryByText('Thu, May 21')).not.toBeNull()
      31 |   })

      at Object.getElementError (node_modules/@testing-library/dom/dist/config.js:32:19)
      at node_modules/@testing-library/dom/dist/query-helpers.js:76:38
      at getByTestId (node_modules/@testing-library/dom/dist/query-helpers.js:59:17)
      at Object.<anonymous> (src/Components/CaseManagement/DatePicker/DatePicker.spec.js:28:20)

以下是调试调用的控制台输出:

代码语言:javascript
运行
复制
 ● Console

    console.log node_modules/@testing-library/react/dist/pure.js:94
      <body>
        <div>
          <div
            class="sc-bdVaJa eYAdNP"
          >
            <div
              class="MuiFormControl-root MuiTextField-root"
            >
              <div
                class="MuiInputBase-root MuiInput-root MuiInputBase-formControl MuiInput-formControl MuiInputBase-adornedEnd"
              >
                <input
                  aria-invalid="false"
                  class="MuiInputBase-input MuiInput-input MuiInputBase-inputAdornedEnd"
                  type="text"
                  value="May 21st"
                />
                <div
                  class="MuiInputAdornment-root MuiInputAdornment-positionEnd"
                >
                  <button
                    aria-label="change date"
                    class="MuiButtonBase-root MuiIconButton-root"
                    data-testid="changeDate"
                    tabindex="0"
                    type="button"
                  >
                    <span
                      class="MuiIconButton-label"
                    >
                      <svg
                        aria-hidden="true"
                        class="MuiSvgIcon-root"
                        focusable="false"
                        viewBox="0 0 24 24"
                      >
                        <path
                          d="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z"
                        />
                        <path
                          d="M0 0h24v24H0z"
                          fill="none"
                        />
                      </svg>
                    </span>
                    <span
                      class="MuiTouchRipple-root"
                    />
                  </button>
                </div>
              </div>

            </div>
          </div>
        </div>
      </body>

注意到与debug()输出有关的以下

  1. 按钮确实出现了,它有一个data-testid和一个aria-label,这两个都不像data-testid那样工作--奇怪的格式设置-- >/>在HTML标记中的断行。这正常吗?也许这就是更大问题的症状??

一如既往,提前感谢您!

EN

回答 2

Stack Overflow用户

发布于 2020-12-29 18:16:34

你可以试试@aquinq发布的内容。我正在使用和你类似的代码,它起作用了:

这是TypeScript中的内容:我们在KeyboardButtonProps中设置了data-testid,如下所示:

代码语言:javascript
运行
复制
<KeyboardDatePicker
          {...props}
          className={cls(styles.root, props.className)}
          label="Fecha"
          // https://github.com/mui-org/material-ui-pickers/issues/1651#issuecomment-614315006
          autoOk={true}
          variant="inline"
          format="dd/MM/yyyy"
          margin="normal"
          id="date-picker-inline"
          value={selectedDate}
          name={name}
          onChange={handleDateChange}
          disablePast={disablePast}
          disableFuture={disableFuture}
          shouldDisableDate={shouldDisableDate}
          KeyboardButtonProps={{
            "aria-label": "change date",
            ...({ ["data-testid"]: "js-datepicker" } as any),
          }}
          InputLabelProps={{ shrink: true }}
        />

我就是这样测试的:

代码语言:javascript
运行
复制
describe("Tests the Anonymous version of the triage", () => {
  it("Happy Path of the Triage will be completed successfully", async () => {
    // The Triage Component has the <KeyboardDatePicker rendered inside it.
    const renderer = await render(<Triage variant="ANONYMOUS" />);
    const calendar = await waitFor(async () => renderer.getByTestId(FECHA));

    await fireEvent.click(calendar);
    // We get the 22nd day of the month:
    const day = await waitFor(async () => renderer.getByText("22"));

    // I'm wrapping 
    await act(async () => {
      await fireEvent.click(day);
      await fireEvent.click(continueBtn);
    });
  });
});
票数 2
EN

Stack Overflow用户

发布于 2020-05-22 21:53:51

你试过等元素吗?

代码语言:javascript
运行
复制
const button = await waitForElement(() => getByTestId('changeDate'))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61956478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档