测试语义 UI 下拉列表:如何等待它被填充?

IT技术 reactjs jestjs semantic-ui-react react-testing-library
2021-05-18 03:13:40

我已经成功地实现了 Semantic-UI Dropdown 来显示公司列表。现在我正在尝试为它构建 Jest/React 测试库测试。为了实现这一点,我构建了这个模拟请求:

beforeEach(() => {
  request.get = jest.fn(() => Promise.resolve({
    companies: [
      {"company_id": 1, "company_name": "ABC"},
      {"company_id": 2, "company_name": "DEF"}
    ]
  }));
});

基于我添加到组件代码中的 console.log,这似乎按预期工作。

这是我的此元素实例的一个节略示例:

<div id="companyId" data-testid="companies-dropdown" role="combobox">
  <input autocomplete="companyId" class="search" type="text">
  <div class="default text" "role="alert">Ex. ABC Corp</div>
  <div role="listbox">
    <div role="option"><span class="text">ABC</span></div>
    <div role="option"><span class="text">DEF</span></div>
  </div>
</div>

我正在努力的地方是在我的测试中正确等待下拉列表填充:

it('Should populate the Search and Select Company dropdown with 2 companies', async () => {
  const { getByTestId, getByText, getByRole } = displayModal();
  const listBox = await waitForElement(() => getByRole('listbox'));
});

错误信息是:无法找到角色为“listbox”的可访问元素

我也尝试过这种替代方法,但得到了相同的错误消息:

const listBox = await waitForElement(() => within(getByTestId('companies-dropdown')).getByRole('listbox'));

可能有人知道我做错了什么吗?

1个回答

我在搜索其他东西时碰巧看到了这个。但是在您的情况下,您使用了错误的角色。我通过以下方式实现了我的用例:

  • 首先聚焦 div 的输入元素以打开下拉菜单。我使用输入元素:
    • userEvent.click(getByLabelText('Company'))
    • 以上可以通过使用data-testid或 与角色 ' combobox'替换
  • 获取选择选项的所有角色:
    • getAllByRole('option')

const companyAbc = getAllByRole('option').find(ele => ele.textContent === 'ABC') userEvent.click(companyAbc); // verify your onChange event

在您的异步情况下:

const companyAbc = await findAllByRole('option').find(ele => ele.textContent === 'ABC') userEvent.click(companyAbc); // verify your onChange event

SemanticReact 还具有onSearchChange事件,如果这是用例,您可以使用它来触发每个输入搜索。