我有一个开玩笑的测试,我正在模拟axios的实现。
在渲染组件时,它会发出一个api调用。
在拨打电话时,我需要测试微调框是否出现。 我需要测试通话结束后微调框是否消失。
我怎么知道模拟承诺何时解决?
axios.get.mockImplementationOnce(() => Promise.resolve({
data:{ query_scores: someData },
}));
const { queryByTestId, getByText } = renderWithRouter(
<MyComponent />,
);
expect(queryByTestId('spinner')).not.toBeNull();
我如何确定在调用not.toBeNull
时尚未兑现承诺?
注意:我正在使用反应测试库,但问题通常与模拟承诺解决的时间有关。
答案 0 :(得分:1)
根据https://jestjs.io/docs/en/asynchronous,返回承诺的时间并没有太多的延迟,但是您需要从测试中返回一个Promise,而Jest会等待该Promise返回(但是很长时间)就是这样。
test('the data is peanut butter', () => {
return fetchData().then(data => {
expect(data).toBe('peanut butter');
});
});
根据您的情况,根据jest.io(https://jestjs.io/docs/en/mock-functions.html),您将使用以下方法返回值:
axios.get.mockResolvedValue(resp);
然后进行测试
return Users.all().then(resp => expect(resp.data).toEqual(users));
如果您想在Promise中添加时间延迟,可以使用setTimeout来控制返回时间
const getData = async () => {
return new Promise(resolve => {
setTimeout(resolve, 1000); //added arbitrary delay
});
};
然后,如果您使用await调用getData函数,则可以测试前后响应,以查看微调框是否按预期显示和消失
expect(queryByTestId('spinner')).not.toBeNull(); //expect spinner on render
await getData();
expect(queryByTestId('spinner')).toBeNull(); //expect no spinner on data returned