当前位置: 主页 > 前端开发

前端上传裁切图片插件-html5图片裁切上传

发布时间:2023-02-12 09:13   浏览次数:次   作者:佚名

课程名称:Web前端架构师

课程章节:第 5 章,第 11 周

讲师:张轩

课程内容:通过测试驱动开发,完成上传组件的hook

分析

我的上传组件需要支持传入的钩子功能

<upload-file beforeUpload="xxx"/>

钩子函数有

写测试文件

上传前

beforeUpload 返回一个布尔值或布尔值的承诺

it.only('before upload check', async () => {
  const beforeUpload = vi.fn((file:File) => file)
  const wrapper = mount(UploadFile, {
    props: {
      beforeUpload
    }
  })
  const fileInput = wrapper.get('input').element
  // 设置 input val, 并返回上传文件的对象
  const testFile = setInputVal(fileInput)
  wrapper.get('input').trigger('change')
  expect(beforeUpload).toHaveBeenCalled()
  expect(request).not.toHaveBeenCalled()
  expect(wrapper.findAll('li').length).toBe(0)
  // 测试 beforeUpload 的参数是否时上传的文件
  expect(beforeUpload).toHaveBeenCalledWith(testFile)
})

测试布尔值

it.only('before upload check use boolean', async () => {
  const wrapper = mount(UploadFile, {
    props: {
      beforeUpload: vi.fn(() => false)
    }
  })
  const fileInput = wrapper.get('input').element
  setInputVal(fileInput)
  wrapper.get('input').trigger('change')
  await flushPromises()
  expect(request).not.toHaveBeenCalled()
  expect(wrapper.findAll('li').length).toBe(0)
})

测试 promsie 布尔值,添加 await flushPromises()

it.only('before upload check use promise boolean', async () => {
  const wrapper = mount(UploadFile, {
    props: {
      beforeUpload: vi.fn(() => new Promise(resolve => {
        setTimeout(() => {
          resolve(false)
        }, 300)
      }))
    }
  })
  const fileInput = wrapper.get('input').element
  setInputVal(fileInput)
  wrapper.get('input').trigger('change')
  await flushPromises()
  expect(request).not.toHaveBeenCalled()
  expect(wrapper.findAll('li').length).toBe(0)
})

写代码

接下来写代码前端上传裁切图片插件,代码很简单前端上传裁切图片插件,只有下面几行

if (props.beforeUpload) {
 const res = await props.beforeUpload(uploadFile)
 if (!res) {
   return
 }
}

本次测试的代码比实现代码多很多,但是可以很好的反映用户所有的操作流程

测试写得越详细,越能在代码中发现问题。

本周回顾

未完成的功能

上传挂钩

拖放上传

需要优化和添加内容

with-credentials 请求时是否携带cookie,默认为false,图片在上传前裁剪

图片描述