如何使用vue-test-utils测试CSS Framework自定义组件

时间:2018-06-26 18:49:46

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

我正在使用Buefy CSS框架,该框架提供了自定义的vue-js组件,例如<b-input><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>时它会通过。但是,在<b-input>数据属性上触发name的'input'事件没有任何作用。

enter image description here

有人知道我如何正确地加<b-input>标签,以便我可以像<input>标签一样对其进行测试吗?

1 个答案:

答案 0 :(得分:0)

我希望这会有所帮助。我意识到,当对它进行存根时,将更改组件的名称,并在末尾添加-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.native中指定要执行的操作b-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