Vue Test Utils & Vue 3:如何有效测试 onKeyStroke() 事件

Vue Test Utils & Vue 3: How to effectively test onKeyStroke() event

我目前正在使用 vueuse/coreonKeyStroke 事件传感器。

onKeyStroke(
      'c',
      (e) => {
        e.preventDefault()
        showAsterisms.value = false
        showConstellations.value = !showConstellations.value
      },
      {
        target: document
      }
    )

我希望通过以下方式测试此功能:

it('Constellations Should Be Visible', async () => {
    wrapper.trigger('keydown', {
      key: 'c'
    })

    await wrapper.vm.$nextTick()

    const canvas = wrapper.find('canvas')

    const canvasAttributes = canvas.attributes()

    expect(canvasAttributes['data-constellations']).toBe('true')
  })

wrapper 是挂载的组件:

const wrapper = mount(MyComponent, {
  props: {
    ...
  }
})

然后我在 canvas 上有以下绑定 属性:

<canvas :data-constellations="showConstellations" />

但是,使用此设置,似乎此特定设置 canvas elmenent 上的 data-constellations 属性始终设置为默认 false,并且在 keyPress 之后它不会更新 ...

有人可以告诉我我需要做什么才能使它正常工作吗?

您的 onKeyStroke 将事件侦听器附加到文档(通过 { target: document } 选项),因此测试必须 dispatch 文档上的 keydown 事件:

it('Constellations Should Be Visible', async () => {
  const wrapper = shallowMount(MyComponent)

  // simulate keypress on document
  const event = new KeyboardEvent('keydown', { key: 'c' })
  document.dispatchEvent(event)

  await wrapper.vm.$nextTick()
  const canvas = wrapper.find('canvas')
  const canvasAttributes = canvas.attributes()
  expect(canvasAttributes['data-constellations']).toBe('true')
})

demo