Как протестировать пользовательские компоненты CSS Framework с помощью vue-test-utils

Я использую Buefy CSS Framework, который предоставляет пользовательские компоненты 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>

Ожидаемый оператор в моем тестовом коде должен пройти так же, как и при использовании <input> тег вместо <b-input>, Тем не менее, запуск события "ввода" на <b-input> ничего не делает для name свойство данных.

Кто-нибудь знает, как я могу правильно заглушить <b-input> тег, чтобы я мог проверить это точно как <input> тег?

1 ответ

Я надеюсь, что это поможет немного. Я понял, что когда заглушка, имя компонента меняется и -stub добавляется в конце.

Так что, если вы заглушки b-input это будет называться b-input-stub когда используешь:

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

Я не думаю, что вам нужно использовать localView а также stubs в то же время. Также вы можете использовать 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.

Другие вопросы по тегам