В контексте тестирования компонентов Vue.js, особенно с использованием Vue Test Utils, ключевыми инструментами для изоляции поведения являются стабы и моки. Их правильное применение позволяет тестировать компоненты независимо от внешних зависимостей, таких как API, Vuex или дочерние компоненты.
Стаб (stub) представляет собой заглушку для компонента, функции или метода, который не является предметом текущего теста. Основная цель стаба — заменить сложный или сторонний функционал на упрощённый вариант, который позволяет сосредоточиться на тестируемом компоненте.
Применение в Vue Test Utils:
import { shallowMount } from '@vue/test-utils';
import ParentComponent from '@/components/ParentComponent.vue';
import ChildComponent from '@/components/ChildComponent.vue';
const wrapper = shallowMount(ParentComponent, {
stubs: {
ChildComponent: true
}
});
true создаёт минимальную заглушку без
содержимого.stubs: {
ChildComponent: '<div class="stub"></div>'
}
const wrapper = shallowMount(ParentComponent, {
global: {
stubs: ['RouterLink', 'FontAwesomeIcon']
}
});
Это позволяет избежать необходимости загружать весь роутер или сторонние библиотеки при юнит-тестировании.
Преимущества стаба:
Ограничения:
Мок (mock) — это объект или функция, имитирующая поведение зависимости, но с возможностью отслеживания вызовов, аргументов и результатов. Основное отличие от стаба в том, что мок не просто заглушка, а инструмент для верификации взаимодействия.
Применение в Vue Test Utils:
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
const myMethodMock = jest.fn();
const wrapper = mount(MyComponent, {
methods: {
fetchData: myMethodMock
}
});
wrapper.vm.fetchData();
expect(myMethodMock).toHaveBeenCalled();
const $axiosMock = {
get: jest.fn(() => Promise.resolve({ data: { id: 1 } }))
};
const wrapper = mount(MyComponent, {
global: {
mocks: {
$axios: $axiosMock
}
}
});
$axios.get и параметры
запроса.import { createStore } from 'vuex';
const actionsMock = {
fetchItems: jest.fn()
};
const store = createStore({
actions: actionsMock
});
const wrapper = mount(MyComponent, {
global: {
plugins: [store]
}
});
wrapper.vm.$store.dispatch('fetchItems');
expect(actionsMock.fetchItems).toHaveBeenCalled();
Моки помогают убедиться, что компонент корректно взаимодействует с глобальными зависимостями.
| Параметр | Стаб | Мок |
|---|---|---|
| Основная цель | Замена компонента/функции без логики | Имитация функциональности с отслеживанием вызовов |
| Контроль вызовов | Нет | Да |
| Используется для | Упрощения тестовой среды | Верификации взаимодействия с зависимостями |
| Примеры | stubs: { ChildComponent: true } |
jest.fn() для методов или Vuex actions |
ChildStub,
axiosMock).Структурированное применение стаба и мока позволяет писать модульные, предсказуемые и изолированные тесты, которые гарантируют корректность работы Vue-компонентов без необходимости подключения всей инфраструктуры приложения.