我正在测试我的带有wit-testing-library的组件,并且测试运行良好。我只是无法摆脱这个警告,fireEvent应该立即包装起来,但是我试图再次包装它,但没有帮助。
这是我的测试用例。
it.only("should start file upload if file is added to the field", async () => {
jest.useFakeTimers();
const { getByTestId } = wrapper;
const file = new File(["filefilefile"], "videoFile.mxf");
const fileInput = getByTestId("drop-zone").querySelector(
"input[type='file']"
);
fireEvent.change(fileInput, { target: { files: [file] } });
act(() => {
jest.runAllTimers();
});
await wait(() => {
expect(
initialProps.uploadItemVideoFileConnect.calledWith(file, 123)
).toBe(true);
});
});
这是警告
Warning: An update to UploadButtonGridComponent inside a test was not wrapped in act(...).
When testing, code that causes React state updates should be wrapped into act(...):
act(() => {
/* fire events that update state */
});
/* assert on the output */
答案 0 :(得分:9)
该问题是由Component内部的许多更新引起的。
我也一样,这就是我解决问题的方式。
await act( async () => {
fireEvent.change(fileInput, { target: { files: [file] } });
});
答案 1 :(得分:2)
这很难总结,但是我会尝试的。
act
警告只是告诉您正在测试的功能组件中发生了某些事情。
假设我们正在绘制待办事项清单
<ul>
{loading ? (
<p>Fetching todos</p>
) : (
<>
{appData.todoList.slice(0, 15).map((item) => {
const { id, title } = item;
return (
<li key={id} data-testid={id}>
<Link to={`/item/${id}`}>{title}</Link>
</li>
);
})}
</>
)}
</ul>
下面的测试用例将引发act
警告
import { waitFor, screen, waitForElementToBeRemoved } from "@testing-library/react";
it("Renders <TodoList /> component", async () => {
render(<TodoList />);
await waitFor(() => expect(axios.get).toHaveBeenCalledTimes(1));
await waitForElementToBeRemoved(() => screen.getByText(/Fetching todos/i));
expect(axios.get).toHaveBeenCalledTimes(1);
todos.slice(0, 15).forEach((td) => {
expect(screen.getByText(td.title)).toBeInTheDocument();
});
});
但是,如果您像这样重新排列await
行
await waitForElementToBeRemoved(() => screen.getByText(/Fetching todos/i));
await waitFor(() => expect(axios.get).toHaveBeenCalledTimes(1);
act
警告消失。这很有道理。您可以确保您的用户不再看到加载指示器。
还有其他情况,请继续阅读肯特·多德斯的这篇文章。
https://kentcdodds.com/blog/fix-the-not-wrapped-in-act-warning
答案 2 :(得分:0)
在source code中,fireEvent
已经包装在act()
中。
该问题可能与以下问题有关,在该问题中,异步逻辑(例如useEffect
)正在触发fireEvent之外的状态更改:
https://github.com/kentcdodds/react-testing-library/issues/281
(没有看到您的组件实现,很难确定这是否正是您的情况。)
显然,有计划在将来的版本中包括异步处理,这样就不会有问题。