Vue Test Utils 多个输入发出重置值

Vue Test Utils Multiple input emits reset value

所以我创建了一个 vue 组件,我正在使用 vue test utils 来测试它。该组件允许用户上传一个文件,该文件更新一个数组,该数组通过输入(如下所示的代码)发出,然后用户可以访问该数组。新文件上传将添加到数组而不是替换。

意味着什么:

我上传了第一个文件,发出的输入事件显示了那个文件;然后我上传第二个文件,发出的输入事件显示该文件和第一个文件。

发生了什么:

我上传了第一个文件,发出的输入事件显示了那个文件;然后我上传第二个文件,但发出的输入只显示第二个文件。

我不确定这里发生了什么,因为当我 运行 在我的浏览器中测试并控制计算的文件时,我看到两个文件在执行与我的测试相同的过程后都在数组中正在做。我认为这是与它更新速度不够快有关,所以我添加了等待下一个滴答声但没有运气。这是错误还是我对测试中的事件不了解?感谢您的帮助。

组件

<template>
   <input type="file" @change="handle"/>
</template>

<script>
   export default {
       props: {
          value: {
            type: Array,
            required: false,
            default() {
                return []
            }
          }
       },

       method: {
           handle(e) {
               const files = e.target.files;

               var newFiles = [];

               for (var i = 0; i < files.length; i++) {
                    newFiles.push(files[i])
               }

               this.files = this.files.concat(newFiles)
           }
       },

       computed: {
           files: {
            get() {
                return this.value
            },

            set(val) {
                this.$emit('input', val)
            }
        }
   }

测试

it('can add to array', async () => {
    const files = [
      {
        name: 'image.png',
        size: 20000000,
        type: 'image/png',
      },
      {
        name: 'image.jpg',
        size: 20000,
        type: 'image/jpeg',
      },
    ]
    const wrapper = mount(Component)

    // Upload first file
    wrapper.vm.handle({
      target: {
        files: [files[0]],
      },
    })

    expect(wrapper.emitted().input[0]).toStrictEqual([
      [files[0]]
    ]);

    await wrapper.vm.$nextTick()

    // Upload second file
    wrapper.vm.handle({
      target: {
        files: [files[1]],
      },
    })

    expect(wrapper.emitted().input[1]).toStrictEqual([files]);
}

我明白现在发生了什么。当组件中的文件数组发生更改时,我会发出它,但我不会将其保存在任何地方,而通常情况下我会用 v-model 保存它。由于我的测试不模拟 v 模型,因此计算的文件集值是一个空数组。所以我需要设置道具值来模拟,我发现我可以为输入事件添加一个侦听器来更新值。

it('can add to array', async () => {
    const files = [
      {
        name: 'image.png',
        size: 20000000,
        type: 'image/png',
      },
      {
        name: 'image.jpg',
        size: 20000,
        type: 'image/jpeg',
      },
    ]
    const wrapper = mount(Component, {
        listeners: {
           // simulate v-model update
           input: (val) => { 
               wrapper.setProps({ value: val });
           }
        }
    })

    // Upload first file
    wrapper.vm.handle({
      target: {
        files: [files[0]],
      },
    })

    expect(wrapper.emitted().input[0]).toStrictEqual([
      [files[0]]
    ]);

    await wrapper.vm.$nextTick()

    // Upload second file
    wrapper.vm.handle({
      target: {
        files: [files[1]],
      },
    })

    expect(wrapper.emitted().input[1]).toStrictEqual([files]);
}

解决此问题的另一种方法是保存到组件数据中的文件数组,然后调用更新函数发出新数组。