Как проверить события на корневом элементе компонента в vue 2? - PullRequest
0 голосов
/ 20 февраля 2019

Я пишу модульные тесты для следующего компонента:

<template>
  <sub-component
     @foo="bar"
  />
</template>
<script>
import SubComponent from './SubComponent';

export default {
  name: 'MyComponent',
  components: { SubComponent },
  methods: {
    bar(payload) {
       this.$emit('baz', ...payload);
    }
  }
}
</script>

И тест будет:

import { shallowMount } from '@vue/test-utils';
import _ from 'lodash';
import MyComponent from '../../components/MyComponent';

describe('MyComponent.vue', () => {
  let wrapper;

  beforeEach(() => {
    wrapper = shallowMount(MyComponent);
  });

  it('should emit baz on subcomponent foo', () => {
    const subComp = wrapper.find('sub-component-stub');
    expect(subComp.exists()).toBe(true);          // passes

    subComp.vm.$emit('foo');

    return wrapper.vm.$nextTick().then(() => {
      expect(wrapper.emitted().baz).toBeTruthy(); // does not pass;

      // upon logging: 
      console.log(_.isEqual(wrapper, subComp));   // => true 
    })
  })
})

Пример упрощен, но принцип здесь я хочуповторно используемый <sub-component> (модальный) и различные функциональные оболочки вокруг него (связанные с одной конкретной задачей, которую выполняет модальный тип), которые отображают дополнительные функциональные возможности.Я не хочу функциональность в родительских компонентах, так как это нарушит DRY - я должен был бы разместить его в каждом компоненте, содержащем определенный тип модальности.

Это будет работать нормально, если <sub-component> былоне прямой ребенок <template>.Почему-то кажется, что wrapper и subComp размещены на одном элементе.

Как это правильно проверить?

1 Ответ

0 голосов
/ 24 февраля 2019

Еще одна возможность - найти ваш элемент в dom и проверить значение испускаемого корневого компонента.

import { shallowMount } from '@vue/test-utils'
import MyComponent from './MyComponent.vue'
import SubComponent from './SubComponent.vue'

describe('MyComponent', () => {    

  it('should emit baz on subcomponent foo', () => {
    const wrapper = shallowMount(MyComponent)
    const subComponent = wrapper.find(SubComponent)

    expect(subComponent.exists()).toBe(true)
    expect(wrapper.emitted('baz')).toBeUndefined()

    subComponent.vm.$emit('foo', ['hello'])
    expect(wrapper.emitted('baz')[0]).toEqual(['hello'])
    // or expect(wrapper).toEmit('baz', 'hello') cf. below for toEmit
  })

})

Если вы хотите использовать собственный сопоставитель для Jest:

toEmit(received, eventName, data) {
  if (data) {
    expect(received.emitted()[eventName][0]).toEqual([data])
  } else {
    expect(received.emitted()[eventName][0]).toEqual([])
  }
  return { pass: true }
} 
...