javascript - 如何在单元测试之前等待组件的挂载回调中的异步调用完成?
问题描述
我正在使用 Jest 对在其mounted()
方法中进行 Axios 调用的组件进行单元测试。我正在模拟 Axios 调用,因此它返回一个承诺,因此实际上并未进行 API 调用。但问题似乎是因为 Axios 是异步的,我如何告诉我的测试在运行我的期望之前等待 Axios 调用(甚至是假的)完成?
这不起作用:
it('calls auth api', () => {
spyOn(axios, 'get').and.callFake(() => Promise.resolve().then(() => authResponse));
wrapper = shallowMount(App, {
localVue,
});
expect(axios.get).toHaveBeenCalledWith('api/auth');
// The "status" data is set in the axios callback. But this fails.
expect(wrapper.vm.status).toBe('AUTHORIZED');
});
如果我将它包装在超时中,它确实有效。我想我读过这是因为在解决承诺后总是调用超时或什么?
it('calls auth api', () => {
spyOn(axios, 'get').and.callFake(() => Promise.resolve().then(() => authResponse));
wrapper = shallowMount(App, {
localVue,
});
expect(axios.get).toHaveBeenCalledWith('api/auth');
setTimeout(() => {
expect(wrapper.vm.status).toBe('AUTHORIZED');
}, 0);
});
有一个更好的方法吗?
谢谢!
解决方案
未经测试,但以下不起作用?
const flushPromises = require('flush-promises');
it('calls auth api', async () => {
spyOn(axios, 'get').and.callFake(() => Promise.resolve().then(() => authResponse));
wrapper = shallowMount(App, {
localVue,
});
await flushPromises(); // <<
expect(axios.get).toHaveBeenCalledWith('api/auth');
});
(您需要添加https://www.npmjs.com/package/flush-promises(或自己编写,大约 4 行代码,返回已解决的承诺)
推荐阅读
- php - PHP 7.2.25 错误!= 错误?
- php - FPDF:在页面末尾添加一些文本
- kotlin - Kotlin 暴露自定义列模块化
- c++ - 为什么 CLion 可以正确构建和链接 Qt,但不能运行我的可执行文件?
- html - CSS的背景在Base.html中不起作用
- ffmpeg - 如何使用 AVPacket 中编码的数据填写 RTMP_Packet 并发送到 RTMP 服务器
- ios - 如何在 Unity 中获取 Firebase 应用程序目录中的文件列表
- google-cloud-platform - 在节点 js 中使用谷歌计算引擎启动脚本
- javascript - 许多元素的对象破坏
- typescript - “类型 '() => string[]' 缺少类型 'string[]' 中的以下属性:pop、push、concat、join 和 25 更多”错误发生在打字稿中