【问题标题】:Testing for a function/method call on click event inside a functional component测试功能组件内点击事件的功能/方法调用
【发布时间】:2020-01-14 09:26:03
【问题描述】:

在碰壁几天后,我了解到使用 vue-test-utils 测试功能组件会导致一些问题

总而言之,我正在使用 Bootstrap-Vue 的 B-Button 和一个 @click 事件,它调用了一些函数/方法。当我尝试运行测试以了解是否调用了该方法时,测试失败。但是,当我将功能 B-Button<button> 交换时,测试通过了。

这里是JobSearch.vue 组件

<template>
  <b-input-group>
    <b-form-input
      class="mr-2 rounded-0"
      placeholder="Enter Search term..."
      id="input-keyword"
    />
<!--    <b-button-->
<!--      @click="searchJobs"-->
<!--      class="rounded-0 ml-2"-->
<!--      variant="primary"-->
<!--      id="reset-button"-->
<!--    >-->
<!--      Reset-->
<!--    </b-button>-->

    <button
      @click="resetFilter"
      class="rounded-0 ml-2"
      id="reset-button">
      Reset
    </button>
  </b-input-group>
</template>
<script>
export default {
  name: 'job-search-test',
  methods: {
    async searchJobs () {
      console.log('Calling Search Jobs from JobsSearchTest')
    },
    resetFilter () {
      console.log('Clicked On Reset')
    }
  },
  mounted () {
    // this.searchJobs()
  }
}
</script>

这里是JobSearch.spec.js

import { shallowMount, createLocalVue } from '@vue/test-utils'
import BootstrapVue from 'bootstrap-vue'
import JobSearchTest from '@/components/jobs/JobSearchTest'

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

describe('JobsSearchTest.vue', () => {
  it('should call searchJobs method when component is mounted', () => {
    let searchJobs = jest.fn()

    shallowMount(JobSearchTest, {
      methods: {
        searchJobs
      },
      localVue })
    expect(searchJobs).toHaveBeenCalledTimes(1)
  })

  it('should call resetFilter method on reset button click event', () => {
    let resetFilter = jest.fn()
    const wrapper = shallowMount(JobSearchTest, {
      methods: {
        resetFilter
      },
      localVue
    })
    expect(resetFilter).not.toHaveBeenCalled()
    wrapper.find('#reset-button').trigger('click')
    console.log(wrapper.find('#reset-button'))
    expect(resetFilter).toHaveBeenCalled()
  })
})

通过注释掉&lt;b-button&gt; 部分并注释&lt;button&gt; 测试失败,但是,如果它可以通过,那就太好了,因为对于这个项目,我们希望使用Bootstrap Vue。

有什么解决方法的想法,不会带走测试的价值吗?例如,根据我之前提出的一个问题,功能组件不能很好地与指令一起使用,因此通过使用非功能存根,指令可以正常工作,但是,这会带走测试的价值。

Use more than one directive to add data attributes to components

【问题讨论】:

  • 你试过用 标签包裹 b 按钮吗?
  • @Skyentao 我没有特别尝试过这个,但我尝试在shallowMount 中存根b-button,这很有效。但是,我随后在 Vue Land Discord 频道上与某人交谈,他建议不要使用 shallowMount。仅当您测试组件而不是任何子组件时,浅挂载才真正有用...并且由于 b-button 是子组件...我需要将其引入
  • 你可以开始使用 boostrap-vue 样板来处理这个案例bootstrap-vue.js.org/docs/components/button-group

标签: javascript unit-testing vue.js vue-test-utils


【解决方案1】:

据我所知,有两个答案。

使用shallowMount 时,应在创建包装器时对功能组件进行存根。

另一种解决方案是使用mount。仅当仅单独测试组件时,浅安装才真正有效。在这里我正在测试孩子......因为b-button是一个孩子组件......我需要把它带进来

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多