Интеграционные тесты предназначены для проверки взаимодействия нескольких компонентов и модулей приложения. В отличие от юнит-тестов, которые изолируют отдельные функции или компоненты, интеграционные тесты оценивают совместную работу компонентов, их реакцию на события и корректность передачи данных через props, события и состояние Vuex.
Во Vue.js интеграционные тесты обычно выполняются с использованием Vue Test Utils и фреймворков для тестирования, таких как Jest или Vitest. Основная цель — убедиться, что компоненты корректно интегрируются друг с другом, а пользовательские сценарии выполняются без ошибок.
npm install --save-dev @vue/test-utils jest vue-jest babel-jest
{
"transform": {
"^.+\\.vue$": "vue-jest",
"^.+\\.js$": "babel-jest"
},
"moduleFileExtensions": ["js", "json", "vue"]
}
tests/integration. Имена файлов можно давать по шаблону
ComponentName.integration.spec.js.1. Рендеринг компонента с дочерними элементами
Vue Test Utils позволяет монтировать компоненты и проверять их структуру. Для интеграционных тестов важна проверка того, что все дочерние компоненты отображаются корректно.
import { mount } from '@vue/test-utils'
import ParentComponent from '@/components/ParentComponent.vue'
import ChildComponent from '@/components/ChildComponent.vue'
test('ParentComponent рендерит ChildComponent', () => {
const wrapper = mount(ParentComponent)
expect(wrapper.findComponent(ChildComponent).exists()).toBe(true)
})
Ключевой момент: метод findComponent
используется для поиска дочерних компонентов по их классу или имени, что
позволяет проверить их наличие и состояние внутри родителя.
2. Передача данных через props
Интеграционные тесты часто проверяют корректность передачи данных между компонентами.
const wrapper = mount(ChildComponent, {
props: { title: 'Тестовый заголовок' }
})
expect(wrapper.text()).toContain('Тестовый заголовок')
Важно тестировать не только отображение данных, но и реакцию дочернего компонента на изменения props.
3. События и их обработка
Vue позволяет компонентам общаться через события. Интеграционные тесты проверяют, что события правильно вызываются и обрабатываются родительским компонентом.
const wrapper = mount(ParentComponent)
wrapper.find('button').trigger('click')
expect(wrapper.emitted('customEvent')).toBeTruthy()
trigger имитирует пользовательское взаимодействие, а
emitted позволяет проверять, что событие было действительно
вызвано.
1. Интеграция с Vuex
Компоненты часто взаимодействуют с состоянием приложения. Для интеграционных тестов создается тестовый store:
import { createStore } from 'vuex'
const store = createStore({
state: { count: 0 },
mutations: {
increment(state) {
state.count++
}
}
})
const wrapper = mount(CounterComponent, {
global: {
plugins: [store]
}
})
wrapper.find('button').trigger('click')
expect(store.state.count).toBe(1)
Ключевой момент: передача store через
global.plugins обеспечивает полное тестирование
взаимодействия компонентов со состоянием.
2. Интеграция с Vue Router
Тестирование маршрутизации необходимо для проверки переходов между страницами:
import { createRouter, createWebHistory } from 'vue-router'
import { mount } from '@vue/test-utils'
import HomePage from '@/views/HomePage.vue'
import AboutPage from '@/views/AboutPage.vue'
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', component: HomePage },
{ path: '/about', component: AboutPage }
]
})
const wrapper = mount(HomePage, {
global: { plugins: [router] }
})
await router.push('/about')
expect(wrapper.html()).toContain('О нас')
Для тестирования компонентов, выполняющих асинхронные действия, таких как запросы к API, используется мокирование.
import axios from 'axios'
jest.mock('axios')
axios.get.mockResolvedValue({ data: { message: 'Привет' } })
const wrapper = mount(ApiComponent)
await wrapper.vm.fetchData()
expect(wrapper.text()).toContain('Привет')
mockResolvedValue позволяет контролировать результат
запроса, обеспечивая стабильность интеграционных тестов.
mount вместо
shallowMount: mount рендерит
компоненты полностью, что необходимо для проверки их
взаимодействия.Интеграционные тесты являются ключевым инструментом обеспечения надежности приложений на Vue.js, позволяя выявлять ошибки взаимодействия компонентов, проверять работу с Vuex, маршрутизатором и внешними сервисами.