我有一個包含 37 個測驗的測驗套件,這些測驗正在測驗我的一個觀點。在本地,所有測驗都通過了,沒有任何問題,但是當我推送代碼時,測驗套件在我們的管道中失敗(我們使用的是 GitLab)。
CI 日志的錯誤輸出非常長(幾千行,甚至超過了 GitLab 設定的限制)。該錯誤由許多“未包含在 act() 中”和“不支持對 act() 的嵌套呼叫”警告組成(Moslty 由useTranslation()I18Next 和TooltipMaterial-UI 等組件觸發)。
我的猜測是來自 API 的異步資料(使用 msw 模擬)在呼叫act()完成后觸發狀態更新,但我不確定如何證明這一點,甚至不知道哪些測驗實際上失敗了。
有沒有人經歷過類似的事情,或者知道發生了什么?
失敗測驗示例:
it.each([
[Status.DRAFT, [PAGE_1, PAGE_11, PAGE_2, PAGE_22, PAGE_3]],
[Status.PUBLISHED, [PAGE_1, PAGE_12, PAGE_2, PAGE_21, PAGE_22, PAGE_221]],
])('should be possible to filter nodes by status %s', async (status, expectedVisiblePages) => {
renderComponent();
await waitFor(() => {
expect(screen.queryByRole('progressbar')).not.toBeInTheDocument();
});
userEvent.click(screen.getByLabelText('components.FilterMenu.MenuLabel'));
const overlay = await screen.findByRole('presentation');
await waitFor(() => expect(within(overlay).queryByRole('progressbar')).not.toBeInTheDocument());
userEvent.click(within(overlay).getByText(`SiteStatus.${status}`));
userEvent.keyboard('{Esc}');
const items = await screen.findAllByRole('link');
expect(items).toHaveLength(expectedVisiblePages.length);
expectedVisiblePages.forEach((page) => expect(screen.getByText(page.title)).toBeInTheDocument());
});
更新 1
好的。所以我把它縮小到這一行:
const items = await screen.findAllByRole('link');
在等待事情出現的程序中,似乎發生了很多事情。我相信對的呼叫findAllByRole已經包含在內act(),這將確保所有更新都已應用。
更新 2
這似乎是一個部分由測驗超時引起的問題。我相信多次呼叫waitFor(...)和find[All]By(...)在同一個測驗中,除了運行緩慢之外,共同超過了測驗的超時時間(默認為 5000 毫秒)。我試圖通過運行測驗來調整這個限制--testTimeout 60000。而現在,一些測驗正在通過。我仍在為“act()”警告而苦苦掙扎。Theese 可能是由完全不同的問題引起的......
獵殺還在繼續……
uj5u.com熱心網友回復:
這是一個常見問題;)
我猜,由于環境(較少的 cpu/mem/etc),您在 CI 服務器上看到了這個問題。
此警告是因為您執行了一些異步操作,但沒有完成它(因為它是異步的)。
您可以在本文中閱讀有關此問題的更多資訊:https ://kentcdodds.com/blog/fix-the-not-wrapped-in-act-warning
最好的解決方案是等待操作完成。例如,通過添加加載指示器并等待元素洗掉。
例如:
it('should show empty table', async () => {
const [render] = createRenderAndStore()
mockResponse([])
const { container } = render(<CrmClientsView />) // - this view do async request in first render
await waitForElementToBeRemoved(screen.queryByRole('test-loading'))
await waitFor(() => expect(container).toHaveTextContent('There is no data'))
})
uj5u.com熱心網友回復:
經過多次嘗試,我終于找到了答案。CI 服務器只有 2 個可用的 CPU,并且通過使用--maxWorkers=2 --maxConcurrent=2而不是默認值運行測驗--maxWorkers=100% --maxConcurrent=5,證明可以解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/416389.html
標籤:
