В одном из комментариев @Anatoly предложил использовать Vue Test Utils . Я играл и нашел решение, которым хотел бы поделиться:
yarn add -D @vue/test-utils
или:
npm install --save-dev @vue/test-utils
Тогда тестовый файл выглядит так:
import Vue from 'vue';
import { shallowMount } from '@vue/test-utils';
import VueExample from "../../../components/VueExample";
describe('VueExample.vue', () => {
let wrapper;
beforeEach(() => {
wrapper = shallowMount(VueExample);
});
it('should change the name', done => {
const textInput = wrapper.find('input');
textInput.setValue('Chuck Norris');
textInput.trigger('input');
expect(wrapper.find('p').text()).to.equal('Bruce Lee');
Vue.nextTick(() => {
expect(wrapper.find('p').text()).to.equal('Chuck Norris');
done();
});
});
});
В этом примере есть только один тест, но я все еще использую beforeEach
, чтобы упростить его расширение с помощью дальнейших тестов. Здесь мы монтируем Vue компонент VueExample
. В тесте мы находим тег <input>
, устанавливаем его значение Чак Норрис и запускаем событие input
. Мы видим, что текстовый узел тега <p>
не изменился и по-прежнему говорит Брюс Ли . Это связано с асинхронным характером обновлений DOM в Vue.
. Используя nextTick()
, мы можем проверить, что изменение вступило в силу, а текстовый узел тега <p>
равен предыдущему установленному значению. Чак Норрис .