double fireEvent在我的反应测试库测试中不起作用

时间:2020-11-06 11:33:44

标签: reactjs typescript react-testing-library

我正在使用React Testing库和Typescript。

我需要测试菜单:单击一个按钮,测试是否显示包含内容的Popper,再次单击按钮,并测试是否显示包含内容的Popper。我还要测试触发按钮是否一直可见。

import React from 'react';
import { fireEvent, render, RenderResult, screen } from '@testing-library/react';
import { AMenu } from './AMenu';

const firstMenuItemLabel = 'Location 1';
const menuTriggerLabel = 'locations';

describe('<AMenu />', () => {
  let component: RenderResult;
  let button: Element;

  beforeEach(() => {
    component = render(
      <AMenu
        classes={{
          root: '',
          menuButton: '',
        }}
      />
    );
    button = component.getByText(menuTriggerLabel).parentElement as Element;
  });

  it('should show and hide on click on menu trigger',  () => {
    expect(button).toBeVisible();
    expect(component.queryAllByText(firstMenuItemLabel)).toHaveLength(0);
    fireEvent.click(button);
    expect(button).toBeVisible();
    expect(component.getByText(firstMenuItemLabel)).toBeVisible();
    fireEvent.click(button);
    expect(component.queryAllByText(firstMenuItemLabel)).toHaveLength(0); // <- here it fails
  });
});

在浏览器中一切正常。 AMenu与屏幕尺寸无关。

当我console.log(component.debug())出现时,我可以看到在第一个事件触发后可见的Popper渲染组件。第二次大火不会改变组件HTML。

1 个答案:

答案 0 :(得分:0)

您需要使用waitForwaitForElementToBeRemoved来确保在对它们进行断言之前,正在等待从DOM中添加/删除元素。

请参阅:https://testing-library.com/docs/guide-disappearance/#waiting-for-appearance