При тестировании компонентов Vue одним из ключевых аспектов является изоляция тестируемого компонента от внешних зависимостей. Для этого используются стабы (stubs) и моки (mocks), которые позволяют заменить реальную реализацию зависимостей упрощёнными или имитированными версиями. Это повышает стабильность тестов и ускоряет их выполнение.
Стаб — это упрощённая версия дочернего компонента, используемая вместо полной реализации при монтировании родительского компонента. Основная цель стаба — изолировать тестируемый компонент от сложной или внешней логики.
import { mount } from '@vue/test-utils';
import ParentComponent from '@/components/ParentComponent.vue';
import ChildComponent from '@/components/ChildComponent.vue';
const wrapper = mount(ParentComponent, {
global: {
stubs: {
ChildComponent: {
template: '<div class="stub">Стаб компонента</div>'
}
}
}
});
console.log(wrapper.html());
// В HTML будет <div class="stub">Стаб компонента</div>
Особенности использования стубов:
'stubs: ['ChildComponent']'.mount(ParentComponent, {
global: {
stubs: ['ChildComponent']
}
});
Моки применяются для подмены глобальных объектов или методов, таких
как $router, $store или $t (для
i18n). Это позволяет избежать необходимости реальной конфигурации
плагинов и сервисов.
import { mount } from '@vue/test-utils';
import MyComponent from '@/components/MyComponent.vue';
const wrapper = mount(MyComponent, {
global: {
mocks: {
$t: (msg) => msg, // Подмена метода перевода
$router: {
push: jest.fn() // Подмена метода роутера
}
}
}
});
wrapper.vm.$router.push('/home');
expect(wrapper.vm.$router.push).toHaveBeenCalledWith('/home');
Ключевые моменты при использовании моков:
jest.fn() для отслеживания
вызовов и параметров.Vue Test Utils предоставляет возможность одновременно применять стабы и моки при монтировании. Это особенно важно для компонентов, которые зависят как от дочерних компонентов, так и от глобальных сервисов.
import { mount } from '@vue/test-utils';
import ParentComponent from '@/components/ParentComponent.vue';
import ChildComponent from '@/components/ChildComponent.vue';
const wrapper = mount(ParentComponent, {
global: {
stubs: {
ChildComponent: {
template: '<button @click="$emit(\'custom-event\')">Click</button>'
}
},
mocks: {
$store: {
state: { count: 0 },
commit: jest.fn()
}
}
}
});
wrapper.find('button').trigger('click');
expect(wrapper.vm.$store.commit).not.toHaveBeenCalled(); // Родитель может реагировать на событие
Важные рекомендации:
global при монтировании.$store,
$router, $axios через моки упрощает
интеграционные проверки.Стабы и моки являются фундаментальным инструментарием Vue Test Utils, позволяя создавать точные, изолированные и предсказуемые тесты компонентов, независимо от их структуры и внешних зависимостей. Их грамотное использование облегчает поддержку тестов и предотвращает ложные срабатывания при изменениях в приложении.