測試失敗是因為在React Testing Library中沒有在findBy之前放置waitFor語句
P粉174151913
P粉174151913 2023-09-09 12:02:38
0
1
387

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粉174151913
P粉174151913

全部回覆(1)
P粉248602298

你在這一行缺少await

userEvent.click(startTimerButton);

所以試試看:

await userEvent.click(startTimerButton);

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!