如何在使用 vue-test-utils 进行单元测试期间触发窗口事件

Bil*_*320 6 vue.js jestjs vue-test-utils

我添加了“attachToDocument”,但我仍然无法在窗口上触发 keyup 事件。

我的依赖项的版本:

"@vue/test-utils": "^1.0.0-beta.29"

"vue": "2.5.18"

<template lang="pug">
div
  h1 123
</template>
<script>
export default {
  mounted() {
    window.addEventListener('keyup', this.handleKeyup)
  },
  beforeDestroy() {
    window.removeEventListener('keyup', this.handleKeyup)
  },
  methods: {
    handleKeyup() {}
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)
import { mount } from '@vue/test-utils'
import test from '@/views/test.vue'

describe('just test', () => {
  it('handle keyup', () => {
    const wrapper = mount(test, {
      attachToDocument: true
    })
    const handleKeyup = jest.fn()
    wrapper.setMethods({ handleKeyup })
    wrapper.trigger('keyup')
    expect(handleKeyup).toHaveBeenCalled()
  })
})
Run Code Online (Sandbox Code Playgroud)

'handleKeyup' 应该被调用。

我在网上找了很久。但是没有用。请帮助或尝试提供一些想法如何实现这一目标。

Hus*_*him 7

您在mounted钩子中设置了事件侦听器,因此当您调用wrapper.setMethods事件侦听器时,已经使用原始空函数进行了设置。也wrapper.trigger将在 Vue 实例上调度事件,但您在window对象上设置了事件侦听器。尝试以下..

import { mount } from '@vue/test-utils'
import test from '@/views/test.vue'

describe('just test', () => {
  it('handle keyup', () => {
    const handleKeyup = jest.fn()
    const wrapper = mount(test, {
        methods: { handleKeyup }
    })
    window.dispatchEvent(new Event('keyup'))
    expect(handleKeyup).toHaveBeenCalled()
  })
})
Run Code Online (Sandbox Code Playgroud)

  • 这基本上是测试 `mounted()` 是否有效。需要测试的是侦听器附加到“window”对象,它在“keyup”上被调用并在 beforeDestroy 上被删除。所以应该使用 [attachToDom](https://vue-test-utils.vuejs.org/api/options.html#attachtodocument)。另一种选择是使用具有 `addEventListener` 和 `removeEventListener` 作为该测试套件的 `jest.fn()` 的 `window` 模拟。 (2认同)