Эта проблема доставляет мне трудности, и я не могу понять, как заставить Vue Test Utils и BootstrapVue хорошо работать вместе.
Минимальный пример будет выглядеть так:
MyComponent.vue
<template>
<div>
<b-button variant="primary" @click="play">PLAY</b-button>
</div>
</template>
<script>
export default {
name: 'MyComponent',
methods: {
play() {
console.log("Let's play!");
}
}
}
</script>
В main.jsмы используем BootstrapVue : Vue.use(BootstrapVue).
Вот как я пытаюсь проверить, clickсработало ли событие:
import { expect } from 'chai';
import sinon from 'sinon';
import Vue from 'vue';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import BootstrapVue, { BButton } from 'bootstrap-vue';
import MyComponent from '@/components/MyComponent.vue';
const localVue = createLocalVue();
localVue.use(BootstrapVue);
describe('MyComponent.vue', () => {
it('should call the method play when button is clicked', () => {
const playSpy = sinon.spy();
const wrapper = shallowMount(MyComponent, {
localVue,
methods: {
play: playSpy,
},
});
wrapper.find(BButton).trigger('click');
expect(playSpy.called).to.equal(true);
});
});
Это дает мне:
AssertionError: expected false to equal true + expected - actual -false +true
Я проверил, как проверить наличие компонента bootstrap vue в модульных тестах с помощью jest? , но это не относится к BButton.
При запуске теста я также не вижу вывода в командной строке, где я ожидал бы выполнения этой строки:
console.log("Let's play!");
Что здесь не так?
Причина, по которой событие clickне может быть запущено, заключается в том, как shallowMountработает в отличие от mount.
Как мы знаем, Vue Test Utils предоставляет два метода для монтирования компонента, т. Е. Рендеринга шаблона и создания дерева DOM:
Первый метод mountгенерирует полное дерево DOM и проходит через все дочерние компоненты. В большинстве случаев в этом нет необходимости, поэтому shallowMountпредпочтительнее использовать этот метод - он заглушает дочерние компоненты всего на один уровень ниже родительского.
В моем случае это тоже было корнем проблемы. BootstrapVue предоставляет компоненты, например BButton, которые можно использовать в ваших собственных шаблонах Vue. Это означает, что в следующем шаблоне:
<template>
<div>
<b-button variant="primary" @click="play">PLAY</b-button>
</div>
</template>
б-кнопка является дочерним компонентом, который затушил при использовании shallowMountв модульных тестах для нашего компонента. Вот почему мы не можем найти кнопку элемента:
const wrapper = shallowMount(MyComponent);
wrapper.find('button'); // won't work
Мы можем найти дочерний компонент так:
wrapper.find(BButton); // BButton has to be imported from bootstrap-vue
но если мы попытаемся вывести визуализированный элемент:
console.log(wrapper.find(BButton).element);
мы получим:
HTMLUnknownElement {}
Как BButtonдочерний компонент не был полностью отрисован, и buttonв дереве DOM нет элемента. Но когда мы используем, mountмы имеем такое поведение:
const wrapper = mount(MyComponent);
console.log(wrapper.find(BButton).element);
мы получим:
HTMLButtonElement { _prevClass: 'btn btn-primary' }
Мы видим, что mountотрисован дочерний компонент. Когда мы используем, mountмы можем напрямую обращаться к buttonэлементу:
wrapper.find('button');
Теперь, когда у нас есть, buttonмы можем вызвать событие, подобное clickэтому.
Надеюсь, это поможет и другим новичкам. Примеры очень упрощены, не забудьте создать localVueusing createLocalVueи передать его mountметоду, как показано в вопросе.
При использовании BootstrapVue очень тщательно подумайте, какой способ монтажа вам нужен.
Продолжая выполнять, shallowMountвы должны уметь это делать:
wrapper.find(BButton).vm.$listeners.click();
Яна Дуггар открыто говорила о своих поисках любви. Вот все, что она сказала на эту тему и о своем пятилетнем окне для замужества.
Звезда «Чужестранки» Сэм Хьюэн недавно рассказал, что он возьмет со съемочной площадки, чтобы вспомнить Джейми Фрейзера, роль, которая сделала его звездой.
«She Loves You» была написана за час, записана за день и стала песней The Beatles с одним из лучших исполнений в их карьере.
У Долли Партон и ее бабушки Бесси были особые отношения. Бабушка Партон была очень больна, но это не мешало Долли разыгрывать ее.
Вы можете подумать, что дуб или гикори — прочные породы дерева, но когда речь идет о самой твердой древесине в мире, они даже близко не стоят.
Океан полон красоты, но он также скрывает одних из самых страшных морских существ на планете. Многие из этих животных скрываются глубоко под поверхностью океана, в тёмном, полном давления мире морских глубин.
Если вы сражаетесь с враждебными мобами или готовитесь к PvP-боям, знание лучших чар для мечей в Minecraft может дать вам серьёзное преимущество. Зачарование мечей позволяет наносить больше урона, увеличивать количество выпадающих мобов и продлевать срок службы меча.
Когда говорят о социалистических странах, часто представляют себе полный государственный контроль и отсутствие частной собственности. Но на практике социалистические экономики сильно различаются.
В «Детях» появится громкая камео и несколько разрушительных новостей
Утверждается, что этот RAV4 находится в отличном состоянии и готов к игре в музыкальные стулья.
На кадрах, снятых с дрона, видно, как пожарные изо всех сил пытаются потушить пламя.
«Глаза Ваканды» напрямую связаны с MCU, а также обновления о «Людях Икс '97», «Что, если...», «Сорвиголова» и многом другом.
Ава Гарднер была замужем за Микки Руни и Фрэнком Синтрой, и встречалась с несколькими другими голливудскими звездами. Вот взгляд назад на историю знакомств Авы Гарднер.
Джон Клиз женился на Дженнифер Уэйд в 2012 году. Вот все, что нужно знать о жене Джона Клиза, Дженнифер Уэйд.
Олимпийская чемпионка Эллисон Феликс вышла замуж за своего мужа Кеннета Фергюсона в 2018 году. Вот все, что нужно знать о муже Эллисон Феликс, Кеннете Фергюсоне.
Мена Сувари замужем за своим мужем Майклом Хоупом с 2018 года. Вот все, что нужно знать о муже Мены Сувари.
Это поражает меня Внезапно, как это часто бывает, Это снова и снова на полпути <Нет, не то, что в Тихом океане, ты темно-бордовый, то, что на карнавале> Каждый громкий заголовок…..
В 2022 году, с выпуском GPT-3, навыки письма, кажется, стали менее важными. С помощью ИИ люди с плохим письмом также могут генерировать качественный персонал.
В современном быстро меняющемся и конкурентном мире карьера играет важную роль в личностном росте, финансовой стабильности и общей удовлетворенности жизнью. Однако многие люди оказываются в безжалостном цикле застоя и неудовлетворенности, постепенно угасая в своей профессиональной жизни.
На прошлой неделе я заметил пресс-релиз, разосланный через PressGazette (новостной веб-сайт британских СМИ). В статье сообщалось, что Acast, скандинавская компания по размещению и рекламе подкастов, возглавит консорциум «вероятно, самых влиятельных» издателей подкастинга.