无法触发vue-upload-component子组件请求的测试问题
解决vue-upload-component测试中无法捕获上传请求的问题
我之前也踩过这个组件的测试坑,它内部的上传触发逻辑确实比普通的@click绑定axios要复杂不少,给你几个亲测可行的解决方向:
1. 直接调用组件核心上传方法,而非update()
update()方法只是用来更新文件的状态信息,并不是触发上传的核心方法。vue-upload-component真正负责发起请求的是upload(),而且组件内部会校验文件的合法性,所以最好传入真实的File对象而非普通模拟对象:
it('should stub request for file upload', (done) => { const wrapperDeep = mount(UploadForm, {}); // 获取上传组件的实例 const uploadComp = wrapperDeep.find({ref: 'upload'}).vm; // 构造符合要求的测试文件对象(组件内部会校验文件类型/大小) const testFile = new File(['测试内容'], 'lazy_load.jpg', { type: 'image/jpeg' }); // 先把文件添加到组件的文件列表 uploadComp.add(testFile); // 直接调用上传方法触发请求 uploadComp.upload(); wrapperDeep.vm.$nextTick(() => { moxios.wait(() => { const request = moxios.requests.mostRecent(); expect(request).not.toBeUndefined(); request.respondWith({ status: 200, response: [ {id: 1, firstName: 'Fred', lastName: 'Flintstone'}, {id: 2, firstName: 'Wilma', lastName: 'Flintstone'} ] }).then(() => { // 这里可以添加上传成功后的UI断言 expect(wrapperDeep.find('.upload-form__item').exists()).toBe(true); done(); }); }); }); });
2. 检查组件的前置触发条件
组件内部有不少前置校验逻辑,可能导致请求无法发起:
- 确认组件的
action属性配置正确,要和moxios拦截的地址完全匹配 - 如果开启了文件校验(比如大小、类型),确保测试文件符合要求
- 如果
auto-upload设为false,需要确保组件状态处于可上传状态(比如文件已选中)
可以在mount组件时传入必要的props:
const wrapperDeep = mount(UploadForm, { propsData: { action: '/upload/post', // 和拦截地址一致 accept: 'image/jpeg' // 匹配测试文件类型 } });
3. 直接mock组件内部的axios实例
如果moxios始终捕获不到请求,大概率是组件内部使用了独立的axios实例而非全局实例。这种情况下直接用jest mock掉axios更可靠:
import axios from 'axios'; jest.mock('axios'); it('should stub request for file upload', async () => { // 预设mock响应 const mockResp = { data: [{id: 1, firstName: 'Fred', lastName: 'Flintstone'}] }; axios.post.mockResolvedValue(mockResp); const wrapperDeep = mount(UploadForm, {}); const uploadComp = wrapperDeep.find({ref: 'upload'}).vm; const testFile = new File(['测试内容'], 'lazy_load.jpg', { type: 'image/jpeg' }); uploadComp.add(testFile); await uploadComp.upload(); // 断言axios是否被正确调用 expect(axios.post).toHaveBeenCalledWith( '/upload/post', expect.any(FormData), expect.any(Object) ); // 断言UI变化 expect(wrapperDeep.find('.upload-form__item').exists()).toBe(true); });
这种方式跳过了moxios的拦截,直接mock请求方法,能避免实例不一致的问题。
内容的提问来源于stack exchange,提问作者van_folmert
相关产品推荐
相关产品推荐

