Тестирование компонентов Vue требует управления состоянием приложения, чтобы изолировать поведение компонента и проверить его корректность. Одним из инструментов для этого являются моки состояния — искусственные объекты или функции, заменяющие реальные данные или методы хранилища (store). Использование моков позволяет контролировать возвращаемые значения, проверять вызовы функций и имитировать различные сценарии работы приложения.
import { shallowMount } from '@vue/test-utils'
import MyComponent from '@/components/MyComponent.vue'
const actions = {
fetchData: jest.fn()
}
const getters = {
data: () => [{ id: 1, name: 'Item 1' }]
}
const store = {
state: {},
actions,
getters,
commit: jest.fn(),
dispatch: jest.fn()
}
const wrapper = shallowMount(MyComponent, {
global: {
mocks: {
$store: store
}
}
})
В этом примере $store заменяется на объект с моками, что
позволяет контролировать как данные (getters), так и
поведение (actions, commit,
dispatch). Такой подход исключает зависимости от реального
состояния приложения и делает тесты детерминированными.
setData или
data при монтировании:const wrapper = shallowMount(MyComponent, {
data() {
return {
counter: 5
}
}
})
expect(wrapper.vm.counter).toBe(5)
wrapper.setData({ counter: 10 })
expect(wrapper.vm.counter).toBe(10)
Моки локального состояния полезны для проверки реактивности и поведения, зависящего от конкретных значений, без необходимости изменения реальных методов компонента.
const wrapper = shallowMount(MyComponent, {
props: {
title: 'Test Title',
isActive: true
}
})
expect(wrapper.props('title')).toBe('Test Title')
expect(wrapper.props('isActive')).toBe(true)
Пропсы можно изменять через setProps, что позволяет
имитировать обновление данных в родительском компоненте:
wrapper.setProps({ isActive: false })
expect(wrapper.props('isActive')).toBe(false)
Моки состояния напрямую влияют на вычисляемые свойства (computed) и методы компонента. Например:
const wrapper = shallowMount(MyComponent, {
global: {
mocks: {
$store: {
getters: {
user: { name: 'Alice', role: 'admin' }
}
}
}
}
})
expect(wrapper.vm.userName).toBe('Alice')
Здесь userName может быть вычисляемым свойством,
возвращающим this.$store.getters.user.name. Мок позволяет
протестировать это свойство без реального Vuex.
Для имитации действий, вызываемых из состояния, можно использовать функции-заглушки (jest.fn()):
const mockAction = jest.fn()
const store = {
dispatch: mockAction
}
const wrapper = shallowMount(MyComponent, {
global: {
mocks: { $store: store }
}
})
wrapper.vm.performAction()
expect(mockAction).toHaveBeenCalledWith('someAction', { id: 1 })
Такой подход позволяет не только проверять состояние, но и контролировать взаимодействие компонента с внешним API или Vuex.
const mutations = {
increment: (state) => state.count++
}
const state = { count: 0 }
const store = { state, commit: (mutation) => mutations[mutation](state) }
const wrapper = shallowMount(MyComponent, {
global: { mocks: { $store: store } }
})
wrapper.vm.incrementCount()
expect(store.state.count).toBe(1)
const wrapper = shallowMount(MyComponent, {
props: { initialValue: 5 },
global: {
mocks: {
$store: {
getters: { factor: 2 }
}
}
}
})
expect(wrapper.vm.computedValue).toBe(10)
Использование моков для состояния обеспечивает гибкость и предсказуемость тестов компонентов Vue. Они позволяют управлять любыми аспектами данных и методов, влияющих на поведение компонента, создавая среду, независимую от реального хранилища, API или родительских компонентов. Это критически важно для написания надёжных и воспроизводимых тестов.