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

Posted

技术标签:

【中文标题】如何使用 vue-test-utils 在单元测试期间触发窗口事件【英文标题】:How to trigger a window event during unit testing using vue-test-utils 【发布时间】:2019-09-08 08:14:37 【问题描述】:

我已经添加了“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>
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()
  )
)

'handleKeyup' 应该已经被调用了。

我在网上搜索了很长时间。但是没有用。请帮助或尝试给出一些想法如何实现这一点。

【问题讨论】:

【参考方案1】:

如果有人需要回答这个问题:

这是对我有用的方法:

首先你需要用defineProperty注册全局模式的removeEventListener

例如:

Object.defineProperty(window, 'removeEventListener', 
    value: jest.fn(),
)

我们写完测试之后

  it('When beforeMounted is executed', async () => 

    await wrapper.destroy()
    expect(window.removeEventListener).toHaveBeenCalled()
    expect(window.removeEventListener).toHaveBeenCalledWith(
      'keyup',
      wrapper.vm.keyUp
   )
)

【讨论】:

【参考方案2】:

您在 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()
  )
)

【讨论】:

这基本上测试mounted() 是否有效。需要测试的是侦听器附加到window 对象,它在keyup 上被调用并在 beforeDestroy 上被删除。所以应该使用attachToDom。另一种选择是使用window 模拟,该测试套件具有addEventListenerremoveEventListener 作为jest.fn()s。

以上是关于如何使用 vue-test-utils 在单元测试期间触发窗口事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?

如何使用 vue-test-utils 和 Jest 在 Nuxt 中对使用 vuex-module-decorators 语法定义的 Vuex 模块进行单元测试?

vue-test-utils:如何在 mount() 生命周期钩子(使用 vuex)中测试逻辑?

VueJs 如何删除全局错误处理程序以使用 vue-test-utils 进行测试

带有 vue-test-utils 和 Jest 的 Vue.js 单元测试用例失败

基于Vue的Jest单元测试入门与实践