我正在使用一个会产生副作用的简单组件。我的测试通过了,但我收到警告 Warning: An update to Hello inside a test was not wrapped in act(...).
。
我也不知道 waitForElement
是否是编写此测试的最佳方式。
我的组件
export default function Hello() {
const [posts, setPosts] = useState([]);
useEffect(() => {
const fetchData = async () => {
const response = await axios.get('https://jsonplaceholder.typicode.com/posts');
setPosts(response.data);
}
fetchData();
}, []);
return (
<div>
<ul>
{
posts.map(
post => <li key={post.id}>{post.title}</li>
)
}
</ul>
</div>
)
}
我的组件测试
import React from 'react';
import {render, cleanup, act } from '@testing-library/react';
import mockAxios from 'axios';
import Hello from '.';
afterEach(cleanup);
it('renders hello correctly', async () => {
mockAxios.get.mockResolvedValue({
data: [
{ id: 1, title: 'post one' },
{ id: 2, title: 'post two' },
],
});
const { asFragment } = await waitForElement(() => render(<Hello />));
expect(asFragment()).toMatchSnapshot();
});
原文由 Pablo Darde 发布,翻译遵循 CC BY-SA 4.0 许可协议
更新的答案:
请参阅下面的@mikaelrs 评论。
不推荐使用的答案:
使用
waitForElement
是正确的方法,来自文档:这是您的案例的工作示例:
index.jsx
:index.test.jsx
:覆盖率 100% 的单元测试结果:
index.test.jsx.snapshot
:源代码: https ://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60115885