虽然我认为您已经在这样做了,但需要注意的第一件事是,您不应该从测试中实际获取任何数据-- 您应该模拟结果。
一旦你这样做了,你将使用waitFor
实用程序来辅助进行异步测试-- 这个实用程序基本上接受返回期望值(expect
)的函数,并将在该测试点保持到满足期望为止。
让我们提供一个例子。看下面我创建的虚构组件:
const MyComponent = () => {
const [data, setData] = useState();
useEffect(() => {
MyService.fetchData().then((response) => setData(response));
}, []);
if (!data) {
return (<p>Loading...</p>);
}
return (
<div>
<h1>DATA!</h1>
<div>
{data.map((datum) => (<p>{datum}</p>))}
</div>
</div>
);
}
因此,对于您的测试,您应该执行
import MyService from './MyService';
import MyComponent from './MyComponent';
describe('MyComponent', () => {
const mockData = ['Spengler', 'Stanz', 'Venkman', 'Zeddmore'];
beforeEach(() => {
jest.spyOn(MyService, 'fetchData')
.mockImplementation(
() => new Promise((res) => setTimeout(() => res(mockData), 200))
);
});
afterEach(() => {
MyService.fetchData.mockRestore();
});
it('displays the loading first and the data once fetched', async () => {
render(<MyComponent />);
expect(screen.getByText(/Loading/)).toBeInTheDocument();
expect(screen.queryByText('DATA!')).toBeNull();
await waitFor(() => expect(screen.getByText('DATA!')).toBeInTheDocument());
expect(screen.queryByText(/Loading/)).toBeNull();
});
});
这段代码没有经过测试,但是类似以下的代码应该可以工作。你对于模拟(mocking)的方法可能会有所不同,取决于你如何构建(fetch)。