【问题标题】:How to trigger a window event during unit testing using vue-test-utils如何使用 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' 应该已经被调用了。

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

【问题讨论】:

    标签: vue.js jestjs vue-test-utils


    【解决方案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。
      猜你喜欢
      • 2018-04-29
      • 2020-06-17
      • 2019-06-01
      • 2019-08-07
      • 2019-04-26
      • 2019-09-04
      • 2021-09-11
      • 1970-01-01
      • 2018-07-07
      相关资源
      最近更新 更多