reactjs - 开玩笑 - 承诺在模拟中解决多少时间后?
问题描述
我有一个开玩笑的测试,我在其中模拟 axios 的实现。
当我渲染我的组件时,它会发出一个 api 调用。
我需要测试我们拨打电话时是否出现了微调器。我需要测试调用完成后微调器是否消失。
我怎么知道模拟承诺何时解决?
axios.get.mockImplementationOnce(() => Promise.resolve({
data:{ query_scores: someData },
}));
const { queryByTestId, getByText } = renderWithRouter(
<MyComponent />,
);
expect(queryByTestId('spinner')).not.toBeNull();
not.toBeNull
我如何确定在调用时承诺尚未解决?
注意:我正在使用反应测试库,但问题通常与模拟承诺解决的时间有关。
解决方案
根据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
推荐阅读
- python-3.x - Pandas 按功能过滤数据框行
- omnet++ - omnet++ 中的 UDP 应用程序
- c# - 如何创建从存储在数据库中的列表中获取复选框的编辑视图?
- android - 我无法在 Android Studio 中导出 Apk 文件
- c# - 使用c#在两个日期之间插入mysql数据
- laravel-backpack - 如何在 Datatable 中订购自定义属性?
- c# - 不要使 IMemoryCache 实现中的缓存项过期
- magento - 如何在magento中修复管理员网址
- ruby - Chef 13 中 method_missing 的替代方法
- oracle - JDBC批量插入Oracle不工作