Pinia. Пакет @pinia/testing дає createTestingPinia - тестову версію стора, що підключається як плагін:
import { createTestingPinia } from '@pinia/testing'
import { vi } from 'vitest'
import { useCartStore } from '@/stores/cart'
const wrapper = mount(CartButton, {
global: {
plugins: [
createTestingPinia({
createSpy: vi.fn,
initialState: { cart: { items: [{ id: 1, qty: 2 }] } },
}),
],
},
})
const cart = useCartStore() // той самий екземпляр, що й у компоненті
await wrapper.get('button').trigger('click')
expect(cart.add).toHaveBeenCalledWith(1)
Що важливо знати:
- дії замінено шпигунами за замовчуванням (
stubActions: true) - викликcart.add()реєструється, але не виконується: стан не зміниться. Тест перевіряє, що компонент викликав дію, а логіку дії тестують окремо; - щоб дії виконувалися -
stubActions: false; initialStateзадає стан за id стора;- геттери можна перевизначити прямо в тесті:
cart.total = 999(тестовий стор це дозволяє) - щоб перевірити відображення без побудови стану; - сам стор тестують без компонентів:
setActivePinia(createPinia())уbeforeEachі виклики дій напряму.
Vue Router. Два підходи:
1. Справжній маршрутизатор з пам'яттю - найближче до реальності:
import { createRouter, createMemoryHistory } from 'vue-router'
const router = createRouter({ history: createMemoryHistory(), routes })
router.push('/orders/7')
await router.isReady()
const wrapper = mount(OrderPage, { global: { plugins: [router] } })
createMemoryHistory не чіпає URL середовища тестів; кожен тест створює новий маршрутизатор, щоб стан не протікав.
2. Моки - для компонентів, яким потрібні лише useRoute()/useRouter():
vi.mock('vue-router', () => ({
useRoute: vi.fn(() => ({ params: { id: '7' } })),
useRouter: vi.fn(() => ({ push: vi.fn() })),
}))
Швидко, але тест не перевіряє справжню навігацію й захисників маршрутів.
RouterLinkStub з Test Utils замінює <RouterLink> без маршрутизатора й дає перевірити to.
Захисників маршрутів (beforeEach з перевіркою автентифікації) варто тестувати на справжньому маршрутизаторі: перейти на захищений маршрут і перевірити, де опинився користувач.