【问题标题】:Vue Testing (JEST): button.trigger('click') not workingVue 测试 (JEST):button.trigger('click') 不起作用
【发布时间】:2020-10-30 21:03:38
【问题描述】:

阅读了大量的 stackoverflow 和 github 讨论,关于 vue jest 遇到 button.trigger('click') 的问题。我今天已经为这个问题苦苦挣扎了几个小时,不得不说我很沮丧,也很惊讶触发('click')这样的简单函数会导致这么多问题。

简而言之,我的代码有一个 b 按钮,@click 从 vuex 触发 fetchData 函数。这在浏览器中运行良好,但在测试模式下,fetchData 不会被执行。

Vue 组件代码

<template>
  <b-button id="loadButton" variant="outline-primary" @click="fetchData">Load Data</b-button>
</template>

<script>
import { mapActions } from 'vuex';
export default {
    name: "LoadAndSave",
    methods: { ...mapActions(['fetchData']) }
}
</script>

测试代码

import { shallowMount, createLocalVue } from '@vue/test-utils'
import Vuex from 'vuex'
import { BootstrapVue } from 'bootstrap-vue'
import LoadAndSave from '../../resources/components/LoadAndSave'

const localVue = createLocalVue()
localVue.use(BootstrapVue)
localVue.use(Vuex)

describe('LoadAndSave.vue', () => {
  let actions
  let getters
  let store

  beforeEach(() => {
    actions = {
      fetchData: jest.fn()
    }
    store = new Vuex.Store({
      actions
    })
  })
  it('LoadAndSave: onClick executes fetchData', async () => {
    const wrapper = shallowMount(LoadAndSave, { localVue, store })
    const button = wrapper.find("#loadButton")
    await button.trigger('click')
    expect(actions.fetchData).toHaveBeenCalled()
  })
})

测试结果

expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

这不是我第一天编码,我也远不是编码专家,但只是无法点击按钮触发的想法真的让我脊背发凉,更不用说伴随的挫败感.

如果有人可以提出任何建议,将不胜感激。

小程

【问题讨论】:

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


    【解决方案1】:

    我也一直在为此苦苦挣扎,似乎有时测试组件很难找到没有括号的函数的发射/调用。

    it('Calls save() when pressing save button', async () => {
      const savebutton = wrapper.find('#saveButton')
      const spy = jest.spyOn(wrapper.vm, 'save')
      savebutton.trigger('click')
      await wrapper.vm.$nextTick()
      expect(spy).toHaveBeenCalled()
      jest.restoreAllMocks()
    })
    

    上面的测试在这里会失败:

    <button class="btn btn-success" id="saveButton" @click="save">Save</button>
    

    但不在这里:

    <button class="btn btn-success" id="saveButton" @click="save()">Spara</button>
    

    您至少可以检查这是否是您的问题,在方法中引用 store 函数并在元素上使用括号调用该函数。

    另一种断言按钮点击已被触发的方法是查看发射的对象。

    it('Calls save() when pressing save button', () => {
      const savebutton = wrapper.find('#saveButton')
      savebutton.trigger('click')
      expect(wrapper.emitted('save')).toHaveLength(1)
    })
    

    【讨论】:

    • 在您回答后延​​迟 20 天表示歉意。我只是想出了我哪里出错了。请注意我使用的是 b-button 标签而不是普通的 button 标签?我将b按钮更改为普通按钮,它起作用了。我实际上在stackoverflow上看到人们在这里谈论它,url是stackoverflow.com/questions/57907756/…,这里也是stackoverflow.com/questions/60541806/…
    • 另外,shallowMount 与 mount,我在我的代码中使用了 shallowMount,它没有引入引导 BButton。更改为挂载后,我的代码工作并且 toHaveBeenCalled 检测到该函数已被触发。 stackoverflow.com/questions/51536537/…。很多这样的东西,我不明白,但至少我知道该怎么做才能让我的代码正常工作。
    • 是的,添加括号似乎可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2018-12-03
    • 2019-12-23
    • 2018-07-02
    • 2019-04-19
    • 2020-05-10
    相关资源
    最近更新 更多