6

我正在使用 Buefy CSS 框架,它提供了自定义的 vue-js 组件,例如<b-input>and <b-table>,我在测试<b-input>标签时遇到了问题。

import { shallowMount, createLocalVue } from '@vue/test-utils'
import BInputPractice from '../BInputPractice.vue'
import Buefy from 'buefy'

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

describe('b-input Practice', () => {
  it('updates the name data property', () => {
    const wrapper = shallowMount(BInputPractice, { 
      localVue,
      stubs: {
        'b-input': Buefy.Input
      } 
    })
    const input = wrapper.find('input')
    input.element.value = 'a name'
    input.trigger('input')
    expect(wrapper.vm.name).toBe('a name')
  })
})

<!-- BInputPractice.vue -->
<template>
  <div>
    <b-input v-model="name"></b-input>
    <!-- <input v-model="name"> -->
  </div>
</template>

<script>
  export default {
    data() {
      return {
        name: ''
      }
    }
  }
</script>

我的测试代码中的 expect 语句应该通过,因为当我使用<input>标签而不是<b-input>. 但是,触发 'input' 事件对data 属性<b-input>没有任何作用。name

在此处输入图像描述

有谁知道我如何正确地对<b-input>标签进行存根,以便我可以将其完全作为<input>标签进行测试?

4

1 回答 1

1

我希望这会有所帮助。我意识到当被存根时,组件的名称会更改并-stub在最后添加。

所以如果你存根b-input它会b-input-stub在使用时被调用:

const wrapper = shallowMount(BInputPractice, { stubs: ['b-input'] })

我不认为你需要同时使用localViewstubs。您也可以使用setData(data)来设置组件的数据。

expect(wrapper.find('b-input-stub').exists()).toBeTruthy() 
wrapper.setData({ name: 'a name' })
expect(wrapper.vm.name).toEqual('a name')

这里trigger('input')不需要启动,因为您没有在模板中指定要执行@input.nativeb-input操作:

<b-input @input.native="updateName" v-model="name"> </b-input>

在脚本中的导出默认值内。

methods: {
    updateName: function () {
      this.$emit('nameUpdate', this.name)
    }
  }

但是要设置和验证自定义组件的值b-input,我会参考vuejs/vue-test-utils

于 2018-11-29T20:31:50.157 回答