首页  >  问答  >  正文

测试失败是因为在React Testing Library中没有在findBy之前放置waitFor语句

render(view)
let timerCellsList;
await waitFor(() => {
  lockCellsList = screen.getAllByTestId('TimerCell');
  expect(lockCellsList).toHaveLength(2);
});

const startTimerButton = within(timerCellsList[1]).getByRole('button');
userEvent.click(startTimerButton);
await waitFor(() => {}, {timeout: 0}); // 测试通过了,没有这行就失败了。
                                       // 我可以设置超时时间为任意数字,包括0。
const activeTimer = await screen.findByRole('cell', {name: /00:00/i});
expect(activeTimer).toBeInTheDocument();

我写了一个测试,用户点击一个按钮。按钮发送网络请求,如果返回200,则显示一个计时器,开始以秒为单位计数。我使用MSW返回模拟响应。由于网络请求明显是异步的,我通过等待调用screen.findByRole来搜索这个计时器。我遇到的问题是,只有在调用userEvent.click(startTimerButton)和调用await screen.findByRole('cell', {name: /00:00/i})之间调用await waitFor(() => {})时,测试才能通过。似乎只有在搜索计时器之前让它休眠一段时间,这个测试才能通过。我不明白为什么我不能立即开始搜索计时器。

没有waitFor语句,我得到的错误消息是:

错误:抛出:“测试超时超过 5000 毫秒。 如果这是一个长时间运行的测试,请使用 jest.setTimeout(newTimeout) 来增加超时值。” var evt = document.createEvent('事件'); 类型错误:无法读取 null 的属性“createEvent”

有人知道是什么原因吗?我希望不必像现在这样绕过它。

我还尝试将我的await findBy更改为在waitFor语句内部包装的getBy,但也没有起作用。似乎我只需要让它休眠一段时间,然后开始搜索。

P粉174151913P粉174151913428 天前420

全部回复(1)我来回复

  • P粉248602298

    P粉2486022982023-09-10 10:14:46

    你在这一行中缺少await

    userEvent.click(startTimerButton);
    

    所以尝试一下:

    await userEvent.click(startTimerButton);
    

    自版本14起,userEvent API是异步的。

    回复
    0
  • 取消回复