Тестирование методов компонентов является важной частью обеспечения корректной работы логики во Vue-приложениях. Vue Test Utils (VTU) предоставляет инструменты для изоляции и проверки поведения методов без необходимости взаимодействия с DOM напрямую.
Для начала необходимо импортировать нужные функции из Vue Test Utils и сам компонент:
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
mount создаёт полноценный экземпляр
компонента, включая его шаблон, реактивные свойства и методы. Для
тестирования методов достаточно вызвать их через экземпляр, возвращаемый
mount.
const wrapper = mount(MyComponent);
wrapper.vm предоставляет доступ к экземпляру Vue, что
позволяет вызывать методы напрямую:
wrapper.vm.myMethod();
Синхронные методы проверяются путём прямого вызова и сравнения возвращаемого результата или изменения состояния компонента.
Пример:
methods: {
incrementCounter() {
this.counter += 1;
}
}
Тест:
test('incrementCounter увеличивает counter на 1', () => {
const wrapper = mount(MyComponent, {
data() {
return { counter: 0 };
}
});
wrapper.vm.incrementCounter();
expect(wrapper.vm.counter).toBe(1);
});
Ключевые моменты:
data в mount позволяет задавать начальное
состояние для более контролируемого тестирования.wrapper.vm.Методы часто принимают аргументы, что расширяет возможности тестов:
methods: {
add(a, b) {
return a + b;
}
}
Тест:
test('add возвращает сумму аргументов', () => {
const wrapper = mount(MyComponent);
expect(wrapper.vm.add(2, 3)).toBe(5);
});
При тестировании методов с параметрами важно проверять все ветви логики, включая граничные значения.
Асинхронные методы могут использовать async/await или
возвращать промисы:
methods: {
async fetchData() {
const response = await fetch('/api/data');
this.data = await response.json();
}
}
Для тестирования таких методов используют мок-функции
(jest.fn()) и await для ожидания
выполнения:
global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve({ id: 1, name: 'Test' }),
})
);
test('fetchData устанавливает data после запроса', async () => {
const wrapper = mount(MyComponent);
await wrapper.vm.fetchData();
expect(wrapper.vm.data).toEqual({ id: 1, name: 'Test' });
});
Особенности:
await гарантирует завершение асинхронной операции перед
проверкой состояния.Методы компонента часто привязаны к событиям DOM. В VTU их можно
проверить через trigger:
<template>
<button @click="incrementCounter">Increment</button>
</template>
Тест:
test('клик по кнопке вызывает incrementCounter', async () => {
const wrapper = mount(MyComponent, {
data() { return { counter: 0 }; }
});
const button = wrapper.find('button');
await button.trigger('click');
expect(wrapper.vm.counter).toBe(1);
});
Важные моменты:
await при trigger необходимо
для реактивного обновления состояния.Jest позволяет создавать шпионы для проверки вызова метода:
test('метод вызывается при клике', async () => {
const incrementSpy = jest.spyOn(MyComponent.methods, 'incrementCounter');
const wrapper = mount(MyComponent);
await wrapper.find('button').trigger('click');
expect(incrementSpy).toHaveBeenCalled();
});
Шпионы полезны для:
wrapper.vm для проверки логики без
зависимости от DOM.await и моки для сторонних зависимостей.Тщательное тестирование методов компонента повышает надёжность приложения, делает поведение компонентов предсказуемым и упрощает рефакторинг. Vue Test Utils предоставляет инструменты как для прямого вызова методов, так и для проверки их интеграции с реактивным состоянием и событиями.