āļāļēāļĢāļāļāļŠāļāļ Vue 3 āđāļāļāļĩ 2026: Vitest, Vue Test Utils āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ
āļāļđāđāļĄāļ·āļāļāļāļīāļāļąāļāļīāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļāļŠāļāļ Vue āđāļāļāļĩ 2026: āļāļēāļĢāļāļąāđāļāļāđāļē Vitest, āļāļēāļĢ mount āļāļāļĄāđāļāđāļāļāļāđāļāđāļ§āļĒ Vue Test Utils, āļāļēāļĢāļāļāļŠāļāļ composable āđāļĨāļ° Pinia store, āļāļēāļĢ mock API, āļāļēāļĢāļ§āļąāļ coverage āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļĩāđāļāļĩāļĄāļāļđāđāļ§āđāļēāļāđāļēāļāļāļēāļĄāļāļĢāļīāļ

āļāļēāļĢāļāļāļŠāļāļ Vue āļāļ·āļāđāļŠāđāļāđāļāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢ refactor āļāđāļ§āļĒāļāļ§āļēāļĄāļĄāļąāđāļāđāļāļāļąāļāļāļēāļĢāđāļāļēāļŠāļļāđāļĄāļāļĩāđāđāļāļĢāļēāļ°āļāļēāļ āđāļĨāļ°āđāļāļāļĩ 2026 āļāļļāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāđāļāđāļĢāļ§āļĄāļāļąāļ§āļāļąāļāļĢāļāļāļŠāļāļāđāļĨāļāļĢāļēāļĢāļĩāļŦāļĨāļąāļ āđāļāđāđāļāđ Vitest āļŠāļģāļŦāļĢāļąāļāđāļāđāļ test runner āđāļĨāļ° Vue Test Utils āļŠāļģāļŦāļĢāļąāļāļāļēāļĢ mount āļāļāļĄāđāļāđāļāļāļāđ āļāļđāđāļĄāļ·āļāļāļĩāđāļāļ°āļāļēāđāļĨāđāļāļąāđāļāđāļāđāļāļēāļĢāļāļąāđāļāļāđāļēāļāļļāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļ āļāļēāļĢāļāļāļŠāļāļāļāļāļĄāđāļāđāļāļāļāđāđāļĨāļ° composable āļāļēāļĢ mock dependency āđāļāļāļāļāļķāļāļāļēāļĢāļāļāļāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĢāļ·āđāļāļāļāļēāļĢāļāļāļŠāļāļ Vue āļāļĩāđāļāļĩāļĄāļāļđāđāļ§āđāļēāļāđāļēāļāļāļēāļĄāļāļąāļāļāļĢāļīāļ
āļāļģāđāļāļ°āļāļģāļĄāļēāļāļĢāļāļēāļāļāļēāļāđāļāļāļŠāļēāļĢ Vue āļāļ·āļāđāļāđ Vitest āļŠāļģāļŦāļĢāļąāļ unit test āđāļĨāļ° component test āđāļāđ Vue Test Utils āđāļāđāļ API āļĢāļ°āļāļąāļāļĨāđāļēāļāļŠāļģāļŦāļĢāļąāļāļāļēāļĢ mount āđāļĨāļ°āđāļāđ Playwright āļŦāļĢāļ·āļ Cypress āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļāļŠāļāļāđāļāļ end-to-end āļāļļāļāđāļāđāļāļāļ·āļ Vitest āđāļāđ config āđāļāļĩāļĒāļ§āļāļąāļāļāļąāļ Vite āļāļĩāđāđāļāļāđāļāđāļāļĒāļđāđ āļāļąāļāļāļąāđāļāđāļāļŠāļāđāļāļķāļāļ§āļīāđāļāļāđāļēāļ transform pipeline āļāļļāļāđāļāļĩāļĒāļ§āļāļąāļāđāļāđāļ° āļāļĢāđāļāļĄ hot reload āļāļĩāđāđāļāļāļāļ°āļāļąāļāļāļĩ
āļāļēāļĢāļāļąāđāļāļāđāļē Vitest āļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļāļāļāđ Vue 3
Vitest āđāļāđ pipeline āļĢāđāļ§āļĄāļāļąāļ Vite āļŦāļĄāļēāļĒāļāļ§āļēāļĄāļ§āđāļēāđāļāļĨāđ config āđāļāļĩāļĒāļāđāļāļĨāđāđāļāļĩāļĒāļ§āļāļąāļāđāļāļĨāļ·āđāļāļāļāļąāđāļ dev server āđāļĨāļ° test runner āļāļąāļ§āđāļĨāļ·āļāļ environment āļāđāļāļāļāļģāļŦāļāļāđāļāđāļ jsdom āļŦāļĢāļ·āļ happy-dom āđāļāļ·āđāļāđāļŦāđ component test āļĄāļĩ DOM āđāļŦāđ render āļĨāļāđāļ āļŠāđāļ§āļāđāļāļĨāļ globals: true āļāļ°āđāļāļīāļāđāļŦāđ describe, it āđāļĨāļ° expect āđāļāđāļāļēāļāđāļāđāđāļāļĒāđāļĄāđāļāđāļāļ import āđāļāļāļļāļāđāļāļĨāđ
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
import { fileURLToPath } from 'node:url'
export default defineConfig({
plugins: [vue()],
test: {
// jsdom provides document/window so components can mount
environment: 'jsdom',
// expose describe/it/expect globally
globals: true,
// run this before each test file (matchers, cleanup)
setupFiles: ['./tests/setup.ts'],
// only pick up *.spec.ts and *.test.ts files
include: ['**/*.{test,spec}.ts'],
},
resolve: {
alias: {
// mirror the @ alias used across the app
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
})āļŠāļģāļŦāļĢāļąāļ Vitest 3 config āļāđāļēāļāļāļāđāļāđāļāļēāļāđāļāđāļāļąāļāļāļĩāļŦāļĨāļąāļāļāļīāļāļāļąāđāļ vitest, @vue/test-utils, @vitejs/plugin-vue āđāļĨāļ° jsdom āđāļĨāļ°āđāļāļ·āđāļāļāļāļēāļ alias āļŠāļ°āļāđāļāļ config āļāļāļāļāļąāļ§āđāļāļ āļāļēāļĢ import āđāļāļ @/composables/useCart āļāļķāļāļāļđāļ resolve āđāļŦāļĄāļ·āļāļāļāļąāļāļāļąāđāļāđāļāđāļāļŠāļāđāđāļĨāļ°āđāļāđāļāļĢāļāļąāļāļāļąāļ
āļāļēāļĢ mount āļāļāļĄāđāļāđāļāļāļāđāļāđāļ§āļĒ Vue Test Utils
Vue Test Utils āđāļāļīāļāļāļļāļāđāļāđāļēāđāļāđāļāļēāļāļŠāļāļāļāļēāļ āđāļāđāđāļāđ mount āļāļĩāđ render āļāđāļāđāļĄāđāļāļāļĄāđāļāđāļāļāļāđāļāļąāđāļāļŦāļĄāļ āđāļĨāļ° shallowMount āļāļĩāđāđāļāļāļāļāļĄāđāļāđāļāļāļāđāļĨāļđāļāļāđāļ§āļĒ stub āļŠāļģāļŦāļĢāļąāļ unit test āļŠāđāļ§āļāđāļŦāļāđāļāļ§āļĢāđāļĨāļ·āļāļ mount āđāļāļĢāļēāļ°āļĄāļąāļāļāļāļŠāļāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļēāļĢ render āļāļāļāļāļĢāļīāļ āļāđāļē wrapper āļāļĩāđāļāļ·āļāļāļĨāļąāļāļĄāļēāļāļ°āļĄāļĩāļāļąāļ§āļāđāļ§āļĒāļāđāļāļŦāļēāļāļĒāđāļēāļ find, get āđāļĨāļ° text āđāļŦāđāđāļāđāļĒāļ·āļāļĒāļąāļāļāļĨāļĨāļąāļāļāđāļāļĩāđ render āļāļāļāļĄāļē
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import PriceTag from '@/components/PriceTag.vue'
describe('PriceTag', () => {
it('formats the amount as currency', () => {
const wrapper = mount(PriceTag, {
// props are passed through the mounting options
props: { amount: 4200, currency: 'EUR' },
})
// get() throws if the selector is missing, unlike find()
expect(wrapper.get('[data-test="price"]').text()).toBe('âŽ42.00')
})
it('applies a discount class when on sale', () => {
const wrapper = mount(PriceTag, {
props: { amount: 4200, currency: 'EUR', onSale: true },
})
// classes() returns the array of applied CSS classes
expect(wrapper.get('[data-test="price"]').classes()).toContain('price--sale')
})
})āļāļēāļĢāđāļāļēāļ°āđāļāļāļĩāđ element āļāđāļēāļāđāļāļāļāļĢāļīāļāļīāļ§āļāđ data-test āđāļāļāļāļĩāđāļāļ°āđāļāđ CSS class āļāđāļ§āļĒāđāļŦāđāđāļāļŠāļāđāļāļāļāļēāļāļāļ§āđāļē āđāļāļĢāļēāļ°āļāļēāļĢāļāļĢāļąāļāļŠāđāļāļĨāđāļāļāļ .price--sale āļāļ°āđāļĄāđāļāļģāđāļŦāđ selector āļāļąāļ āļĄāļĩāđāļāļĩāļĒāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļĢāļīāļāđāļāđāļēāļāļąāđāļāļāļĩāđāļāļģāđāļŦāđāđāļāļŠāļāđāļĨāđāļĄ āļāļēāļĢāđāļĒāļāļŠāđāļ§āļāđāļāļāļāļĩāđāđāļāđāļāđāļāļ§āļāļīāļāļāļĩāđāļāļāļāđāļģ āđ āđāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļŠāļāđ Vue āļāļĩāđāļāļđāđāļĨāļĢāļąāļāļĐāļēāļāđāļēāļĒ
āļāļēāļĢāļāļāļŠāļāļ user event āđāļĨāļ° event āļāļĩāđāļāļđāļ emit
āļāļāļĄāđāļāđāļāļāļāđāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāđāļāļāļāļāļģāđāļāđāļāļāđāļāļāļĄāļĩāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļĨāļ§āđāļēāļāļ°āđāļāļīāļāļāļ°āđāļĢāļāļķāđāļāļŦāļĨāļąāļāļāļēāļĢāļāļĨāļīāļāļŦāļĢāļ·āļāļāļēāļĢāļāļīāļĄāļāđ Vue Test Utils āļāļ·āļāļāđāļē promise āļāļēāļ trigger āđāļĨāļ°āļāļēāļĢ await āļĄāļąāļāļāļ° flush āļāļīāļ§ reactivity āļāļāļ Vue āđāļāļ·āđāļāđāļŦāđ DOM āļŠāļ°āļāđāļāļāļāļēāļĢāļāļąāļāđāļāļ āļŠāđāļ§āļāļāļąāļ§āļāđāļ§āļĒ emitted āļāļ°āļāļąāļāļāļķāļāļāļļāļ custom event āļāļĩāđāļāļāļĄāđāļāđāļāļāļāđāļĒāļīāļāļāļāļāļĄāļē āļāļķāđāļāđāļāđāļāļ§āļīāļāļĩāļāļĢāļ§āļāļŠāļāļāļŠāļąāļāļāļēāļĢāļ°āļŦāļ§āđāļēāļ parent āļāļąāļ child
import { describe, it, expect } from 'vitest'
import { mount } from '@vue/test-utils'
import SearchBar from '@/components/SearchBar.vue'
describe('SearchBar', () => {
it('emits search with the typed query', async () => {
const wrapper = mount(SearchBar)
// setValue writes to the input and fires an input event
await wrapper.get('input').setValue('vitest')
// awaiting trigger flushes the reactivity queue before assertions
await wrapper.get('[data-test="submit"]').trigger('click')
// emitted() returns a record of every event and its payloads
const events = wrapper.emitted('search')
expect(events).toHaveLength(1)
// events[0] is the first emission, [0] its first argument
expect(events![0][0]).toBe('vitest')
})
})Vue āļĢāļ§āļĄāļāļēāļĢāļāļąāļāđāļāļ reactive āđāļāđāļēāļāđāļ§āļĒāļāļąāļāđāļāļ asynchronous āļāļēāļĢāļĨāļ·āļĄ await āļāļēāļĢāđāļĢāļĩāļĒāļ trigger āļŦāļĢāļ·āļ setValue āļāļ·āļāļŠāļēāđāļŦāļāļļāļāļĩāđāļāļāļāđāļāļĒāļāļĩāđāļŠāļļāļāļāļāļāđāļāļŠāļāđ Vue āļāļĩāđāļāļĨāļĨāļąāļāļāđāđāļĄāđāđāļāđāļāļāļ āđāļāļĢāļēāļ°āļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļĨāļāļ°āļāļģāļāļēāļāļāđāļāļāļāļĩāđ DOM āļāļ° re-render āļāļķāļāļāđāļēāļāļāđāļēāļāļĩāđāļĒāļąāļāđāļĄāđāļāļąāļāđāļāļ āļŦāļēāļāļĄāļĩāļāļēāļĢāđāļāļĨāļĩāđāļĒāļ state āđāļāļīāļāļāļķāđāļāļāļāļāļāļąāļ§āļāđāļ§āļĒ event āđāļŦāđ import nextTick āļāļēāļ vue āđāļĨāđāļ§ await nextTick() āļāđāļāļāļĒāļ·āļāļĒāļąāļāļāļĨ
āļāļēāļĢāļāļāļŠāļāļ Vue composable āđāļāļāđāļĒāļāļāļīāļŠāļĢāļ°
Composable āļāļĩāđāđāļāđāđāļāļĩāļĒāļ reactivity API (ref, computed, watch) āđāļĄāđāļāļģāđāļāđāļāļāđāļāļāļĄāļĩāļāļāļĄāđāļāđāļāļāļāđāđāļĨāļĒ āđāļāļĢāļēāļ°āļĄāļąāļāļāļ·āļāļāļąāļāļāđāļāļąāļāļāļĢāļĢāļĄāļāļēāļāļĩāđāļāļ·āļ reactive state āļāļāļāļĄāļē āļāļąāļāļāļąāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāđāļāļĒāļāļĢāļāđāļĨāđāļ§āļĒāļ·āļāļĒāļąāļāļāļĨāļāļ .value āļāđāđāļāļĩāļĒāļāļāļ āļāļĩāđāļāļ·āļāļ§āļīāļāļĩāļāļĩāđāđāļĢāđāļ§āļāļĩāđāļŠāļļāļāđāļĨāļ°āđāļāļēāļ°āļāļāļāļĩāđāļŠāļļāļāđāļāļāļēāļĢāļāļĢāļāļāļāļĨāļļāļĄāļāļĢāļĢāļāļ°āļāļēāļāļāļļāļĢāļāļīāļ āđāļĨāļ°āđāļāđāļēāļāļąāļāđāļāđāļāļĩāļāļąāļāđāļāļāđāļāļīāļĢāđāļāđāļcomposable āļāļąāđāļāļŠāļđāļāļāļāļ Vue 3
import { describe, it, expect } from 'vitest'
import { useCart } from '@/composables/useCart'
describe('useCart', () => {
it('tracks total price as items change', () => {
// composables using only ref/computed run without mounting
const { items, total, addItem } = useCart()
expect(total.value).toBe(0)
addItem({ id: 1, price: 1500, qty: 2 })
// computed total recalculates synchronously on state change
expect(total.value).toBe(3000)
addItem({ id: 2, price: 500, qty: 1 })
expect(items.value).toHaveLength(2)
expect(total.value).toBe(3500)
})
})Composable āļāļĩāđāļāļķāđāļāļāļē lifecycle hook āļāļĒāđāļēāļ onMounted āđāļāđāļāļāđāļāļĒāļāđāļ§āđāļ āđāļāļĢāļēāļ°āļĄāļąāļāļāđāļāļāļāļģāļāļēāļāļ āļēāļĒāđāļ instance āļāļāļāļāļāļĄāđāļāđāļāļāļāđ āļ§āļīāļāļĩāđāļāđāļāļĩāđāļāļīāļĒāļĄāđāļāđāļāļ·āļāļŠāļĢāđāļēāļāļāļāļĄāđāļāđāļāļāļāđāļāļąāļ§āļāđāļ§āļĒāđāļĨāđāļ āđ āļāļĩāđāđāļĢāļĩāļĒāļ composable āđāļ setup āđāļĨāđāļ§āđāļāļīāļāļāļĨāļĨāļąāļāļāđāļāļāļāļĄāļē āļāļēāļāļāļąāđāļāļāļķāļ mount āļāļāļĄāđāļāđāļāļāļāđāļāļąāļ§āļāđāļ§āļĒāļāļąāđāļāļāđāļ§āļĒ Vue Test Utils
āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Vue.js / Nuxt.js āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āļāļēāļĢ mock āļāļēāļĢāđāļĢāļĩāļĒāļ API āļāđāļ§āļĒ vi.mock
āļāļģāļāļāļāđāļēāļāđāļāļĢāļ·āļāļāđāļēāļĒāļāļĢāļīāļāļāļģāđāļŦāđāđāļāļŠāļāđāļāđāļēāđāļĨāļ°āđāļĄāđāļāļāđāļŠāđāļāļāļāļ§āļē Vitest āļāļķāļāđāļāļāļāļĩāđāđāļĄāļāļđāļĨāļāđāļ§āļĒ vi.mock āđāļĨāļ°āļŠāļĢāđāļēāļāļāļąāļāļāđāļāļąāļ spy āļāđāļ§āļĒ vi.fn āđāļāļāđāļāļīāļĢāđāļāļāđāļēāļāļĨāđāļēāļāļāļ° mock āđāļĄāļāļđāļĨāļāļĩāđāļŦāđāļ fetch āđāļ§āđ āđāļāļ·āđāļāđāļŦāđ composable āļāļĩāđāļāļģāļĨāļąāļāļāļāļŠāļāļāđāļāđāļĢāļąāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļ§āļāļāļļāļĄāđāļāđāđāļāļĒāđāļĄāđāļāđāļāļāļĒāļīāļāđāļāļāļĩāđāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāđāļĨāļĒ
import { describe, it, expect, vi, beforeEach } from 'vitest'
import { useProducts } from '@/composables/useProducts'
import { getProducts } from '@/api/products'
// replace the whole module with mocked exports
vi.mock('@/api/products', () => ({
getProducts: vi.fn(),
}))
describe('useProducts', () => {
beforeEach(() => {
// reset call history between tests to avoid leakage
vi.mocked(getProducts).mockReset()
})
it('exposes fetched products and clears loading', async () => {
// define what the mocked API returns for this test
vi.mocked(getProducts).mockResolvedValue([
{ id: 1, name: 'Keyboard' },
])
const { products, loading, load } = useProducts()
await load()
expect(getProducts).toHaveBeenCalledOnce()
expect(loading.value).toBe(false)
expect(products.value[0].name).toBe('Keyboard')
})
})āļāļēāļĢ mock āļāļĩāđāļāļāļāđāļāļāļāļāļāđāļĄāļāļđāļĨāļāđāļ§āļĒāđāļŦāđāļāļĢāļĢāļāļ°āļ āļēāļĒāđāļāļāļāļ composable āđāļĄāđāļāļđāļāđāļāļ°āļāđāļāļ āđāļāļāļāļ°āļāļĩāđāđāļŦāđāđāļāđāļĨāļ°āđāļāļŠāļāđāļāļ§āļāļāļļāļĄ response āļāļāļ API āđāļāđāđāļāđāļĄāļāļĩāđ āļĢāļ§āļĄāļāļķāļāđāļŠāđāļāļāļēāļāļāļĩāđāđāļāļīāļ error āļāđāļ§āļĒ āļāļēāļĢāđāļĢāļĩāļĒāļ mockRejectedValue āđāļāļāļāļ°āļāļģāđāļŦāđāđāļāļŠāļāđāđāļāļĩāļĒāļāļāļąāļ§āđāļāļĩāļĒāļ§āļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāđāļāđāļ§āđāļēāđāļĄāļ·āđāļāđāļāļīāļāļāļ§āļēāļĄāļĨāđāļĄāđāļŦāļĨāļ§ state āļāļāļ error āļāļ°āļāļđāļāļāļąāđāļāļāđāļēāđāļĨāļ° spinner āļāļ°āļŦāļĒāļļāļāļŦāļĄāļļāļ
āļāļēāļĢāļāļāļŠāļāļ Pinia store āđāļāļāļĩ 2026
Store āđāļāđāļ state āļāļĩāđāđāļāđāļĢāđāļ§āļĄāļāļąāļāļāđāļēāļĄāļāļāļĄāđāļāđāļāļāļāđ āđāļĨāļ°āđāļāđāļāđāļāļāļāļēāļāļāļēāļĢ @pinia/testing āļāļģāđāļŦāđāļāļāļŠāļāļāđāļāđāļāļĢāļāđāļāļāļĢāļāļĄāļē āđāļāļĒāļāđāļēāđāļĢāļīāđāļĄāļāđāļ createTestingPinia āļāļ° stub āļāļļāļ action āđāļ§āđ āļāļąāļāļāļąāđāļ component test āļāļķāļāļŠāļēāļĄāļēāļĢāļāļĒāļ·āļāļĒāļąāļāđāļāđāļ§āđāļēāļĄāļĩāļāļēāļĢ dispatch action āļāļāļāđāļāđāļāļĒāđāļĄāđāļāđāļāļāļĢāļąāļ side effect āļāļāļāļĄāļąāļ āļāļđāđāļĄāļ·āļāļāļēāļĢāļāļāļŠāļāļ Pinia āđāļāļ°āļāļģāđāļāļ§āļāļēāļāļāļĩāđāļŠāļģāļŦāļĢāļąāļāđāļāļŠāļāđāļĢāļ°āļāļąāļāļāļāļĄāđāļāđāļāļāļāđ
import { describe, it, expect, vi } from 'vitest'
import { mount } from '@vue/test-utils'
import { createTestingPinia } from '@pinia/testing'
import CheckoutButton from '@/components/CheckoutButton.vue'
import { useCartStore } from '@/stores/cart'
describe('CheckoutButton', () => {
it('dispatches checkout on click', async () => {
const wrapper = mount(CheckoutButton, {
global: {
plugins: [
// vi.fn spies on actions instead of executing them
createTestingPinia({ createSpy: vi.fn }),
],
},
})
const store = useCartStore()
await wrapper.get('[data-test="checkout"]').trigger('click')
// the action is stubbed, so only the dispatch is asserted
expect(store.checkout).toHaveBeenCalledOnce()
})
})āļŦāļēāļāļāđāļāļāļāļēāļĢāļāļāļŠāļāļāļāļĢāļĢāļāļ°āļāļāļ store āđāļāļāđāļāļāļāļēāļĢāļāļāļŠāļāļāļāļēāļĢāļāļŠāļēāļāđāļāđāļēāļāļąāļāļāļāļĄāđāļāđāļāļāļāđ āđāļŦāđāļŠāđāļ stubActions: false āđāļāļ·āđāļāđāļŦāđ action āļāļģāļāļēāļāļāļēāļĄāļāļāļāļī āđāļĨāđāļ§āļāļķāļāļĒāļ·āļāļĒāļąāļāļāļĨāļāļ state āļāļĩāđāđāļāđ āļāļēāļĢāđāļĒāļāļĢāļ°āļŦāļ§āđāļēāļāđāļāļŠāļāđāļāļāļĄāđāļāđāļāļāļāđāļāļĩāđ stub action āļāļąāļāđāļāļŠāļāđ store āļāļĩāđāđāļāđ action āļāļĢāļīāļ āļāđāļ§āļĒāđāļŦāđāđāļāđāļĨāļ° suite āđāļāļāļąāļŠāļāļĒāļđāđāļāļąāļāļāļ§āļēāļĄāļĢāļąāļāļāļīāļāļāļāļāđāļāļĩāļĒāļāļāļĒāđāļēāļāđāļāļĩāļĒāļ§
āļāļēāļĢāļĢāļąāļāđāļāļŠāļāđāđāļ watch mode āđāļĨāļ°āļāļēāļĢāļ§āļąāļ coverage
Vitest āļĄāļēāļāļĢāđāļāļĄ watch mode āļāļĩāđāļĢāļąāļāļāđāļģāđāļāļāļēāļ°āđāļāļŠāļāđāļāļĩāđāđāļāđāļĢāļąāļāļāļĨāļāļĢāļ°āļāļāļāļēāļāđāļāļĨāđāļāļĩāđāđāļāļīāđāļāļāļąāļāļāļķāļ āļāļķāđāļāļĒāđāļāļĢāļāļ feedback āļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļāļąāļāļāļēāđāļŦāđāđāļŦāļĨāļ·āļāđāļāļĩāļĒāļāđāļŠāļĩāđāļĒāļ§āļ§āļīāļāļēāļāļĩ āļŠāđāļ§āļāļāļēāļĢāļĢāļēāļĒāļāļēāļ coverage āļĄāļĩāļĄāļēāđāļŦāđāđāļāļāļąāļ§āļāđāļēāļ provider @vitest/coverage-v8 āđāļĨāļ°āļāļŠāļēāļāđāļāđāļēāļāļąāļ pipeline āļāļāļ continuous integration āđāļāđāļāļĒāđāļēāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒ āđāļāļĒāđāļāļŠāļāđāļāļĩāđāļĨāđāļĄāđāļŦāļĨāļ§āļŦāļĢāļ·āļ coverage āļāļĩāđāļāļāļāļāļĒāļĨāļāļŠāļēāļĄāļēāļĢāļāļāļĨāđāļāļāļāļēāļĢ merge āđāļāđ
export default defineConfig({
test: {
coverage: {
// v8 is the fastest provider and needs no instrumentation step
provider: 'v8',
reporter: ['text', 'html', 'lcov'],
// fail CI when a threshold drops below the target
thresholds: {
statements: 80,
branches: 75,
functions: 80,
},
// exclude generated and config files from the report
exclude: ['**/*.config.ts', '**/types/**'],
},
},
})āļāļēāļĢāļĢāļąāļ vitest āđāļāļĩāļĒāļāļāļĒāđāļēāļāđāļāļĩāļĒāļ§āļāļ°āđāļĢāļīāđāļĄ watch mode āļāļāđāļāļĢāļ·āđāļāļāļāđāļāļāļāļīāđāļ āđāļāļāļāļ°āļāļĩāđ vitest run --coverage āļāļ°āļĢāļąāļāđāļāļāļāđāļēāļāļāļĢāļąāđāļāđāļāļĩāļĒāļ§āļāļķāđāļāđāļŦāļĄāļēāļ°āļāļąāļ CI āļāļēāļĢāļāļģāļŦāļāļ threshold āļāļĒāđāļēāļāļāļąāļāđāļāļāđāļāļĨāļĩāđāļĒāļ coverage āļāļēāļāļāļąāļ§āđāļĨāļāđāļ§āđāļāļ§āļāđāļŦāđāļāļĨāļēāļĒāđāļāđāļāļāđāļēāļāļāļļāļāļ āļēāļāļāļĩāđāļāļąāļāļāļąāļāđāļāđāļāļĢāļīāļ āđāļāļĢāļēāļ° pull request āļāļĩāđāļāļģāđāļŦāđ branch coverage āļāļāļĨāļāļāđāļģāļāļ§āđāļē 75 āđāļāļāļĢāđāđāļāđāļāļāđāļāļ°āļĨāđāļĄāđāļŦāļĨāļ§āļāļąāļāđāļāļĄāļąāļāļī āļāļķāđāļāļāļĢāļ°āļāļļāđāļāđāļŦāđāļāļđāđāļāļąāļāļāļēāļāļāļŠāļāļāđāļŠāđāļāļāļēāļāļāļĩāđāļāļąāļ§āđāļāļāđāļāļīāđāļĄāđāļāđāļēāļĄāļē āđāļĄāđāđāļāđāđāļāļĩāļĒāļāđāļŠāđāļāļāļēāļāļāļĩāđāļāļļāļāļāļĒāđāļēāļāļĢāļēāļāļĢāļ·āđāļāđāļāđāļēāļāļąāđāļ
āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĢāļ·āđāļāļāļāļēāļĢāļāļāļŠāļāļ Vue āļāļĩāđāļāļāļāđāļāļĒāļāļĢāđāļāļĄāļāļģāļāļāļ
āļāļģāļāļēāļĄāđāļĢāļ·āđāļāļāļāļēāļĢāļāļāļŠāļāļāļāļĢāļēāļāļāđāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Vue āļĢāļ°āļāļąāļ senior āđāļāļ·āļāļāļāļļāļāļāļĢāļąāđāļ āđāļāļĢāļēāļ°āļĄāļąāļāđāļāļĒāđāļŦāđāđāļŦāđāļāļ§āđāļēāļāļđāđāļŠāļĄāļąāļāļĢāļāļīāļāđāļĢāļ·āđāļāļāļāļēāļĢāļāļđāđāļĨāļĢāļąāļāļĐāļēāđāļāđāļāļāļĒāđāļēāļāđāļĢ āļāļģāļāļāļāļāđāļēāļāļĨāđāļēāļāļāļĢāļāļāļāļĨāļļāļĄāđāļāļ§āļāļīāļāļāļĩāđāļāļđāļāļāļēāļĄāļāđāļāļĒāļāļĩāđāļŠāļļāļ āđāļĨāļ°āļāļļāļāļāļģāļāļēāļĄāļāļāļąāļāđāļāđāļĄāļĄāļĩāđāļŦāđāļāļķāļāđāļāđāļĄāļāļđāļĨāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļĢāļāļāļŠāļāļ Vue
āļāļ§āļĢāđāļāđ shallowMount āđāļāļ mount āđāļĄāļ·āđāļāđāļ? āđāļĨāļ·āļāļāđāļāđ shallowMount āđāļĄāļ·āđāļāļāļāļĄāđāļāđāļāļāļāđ render āļĨāļđāļāļāļĩāđāļŦāļāļąāļāļŦāļĢāļ·āļāļāļđāļāļāļāļŠāļāļāđāļ§āđāđāļĨāđāļ§ āđāļĨāļ°āđāļāļŠāļāđāļŠāļāđāļāđāļāļĩāļĒāļāļāļĢāļĢāļāļ°āļāļāļ parent āđāļāđāļēāļāļąāđāļ āļāļēāļĢ stub āļĨāļđāļāļāļ°āđāļĒāļ unit āđāļŦāđāļāļīāļŠāļĢāļ°āđāļĨāļ°āđāļĢāđāļāļāļēāļĢ render āđāļŦāđāđāļĢāđāļ§āļāļķāđāļ āđāļĨāļāļāļąāļāļāļēāļĢāļāļĩāđāđāļĄāđāđāļāđāļāļĢāļ§āļāļŠāļāļāļāļēāļĢāļāļŠāļēāļāļāļĢāļīāļāļĢāļ°āļŦāļ§āđāļēāļāļāļāļĄāđāļāđāļāļāļāđ
Vue Test Utils āļāļąāļāļāļēāļĢāļāļēāļĢāļāļąāļāđāļāļāđāļāļ asynchronous āļāļĒāđāļēāļāđāļĢ? Vue āļāļģāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ reactive āđāļāđāļāđāđāļ tick āļāļąāļāđāļ āļāļąāļ§āļāđāļ§āļĒ event āļāļĒāđāļēāļ trigger āđāļĨāļ° setValue āļāļ·āļ promise āļāļĩāđ resolve āļŦāļĨāļąāļāļāļēāļ DOM āļāļąāļāđāļāļāđāļĨāđāļ§ āļāļąāļāļāļąāđāļāļāļēāļĢ await āļĄāļąāļāļāđāđāļāļĩāļĒāļāļāļ āļŠāđāļ§āļ state āļāļĩāđāđāļāļĨāļĩāđāļĒāļāļāļāļāļāļąāļ§āļāđāļ§āļĒāđāļŦāļĨāđāļēāļāļąāđāļ āđāļŦāđāđāļāđ await nextTick() āđāļāļ·āđāļāļāļąāļāļāļąāļāđāļŦāđāļāļīāļ§ flush āļāđāļāļāļāļĩāđāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļĨāļāļ°āļāļģāļāļēāļ
find āļāļąāļ get āļāđāļēāļāļāļąāļāļāļĒāđāļēāļāđāļĢ? find āļāļ·āļ wrapper āđāļāļĨāđāļēāđāļĄāļ·āđāļāđāļĄāđāļĄāļĩ element āļāļĢāļāļāļąāļāđāļĨāļ°āļāļ°āđāļĄāđ throw āļāļķāđāļāđāļŦāļĄāļēāļ°āļāļąāļāļāļēāļĢāļĒāļ·āļāļĒāļąāļāļāļĨāđāļāļ expect(wrapper.find('.error').exists()).toBe(false) āļŠāđāļ§āļ get āļāļ° throw āļāļąāļāļāļĩāđāļĄāļ·āđāļāđāļĄāđāļāļ element āļāļģāđāļŦāđāđāļāđāļāļāļąāļ§āđāļĨāļ·āļāļāļāļĩāđāļāļĩāļāļ§āđāļēāđāļĄāļ·āđāļāļāļēāļāļ§āđāļē element āļāļąāđāļāļāđāļāļāļĄāļĩāļāļĒāļđāđ āđāļĨāļ°āļāļēāļĢāļŦāļēāļĒāđāļāļāļāļāļĄāļąāļāļāļ·āļāļāļ§āļēāļĄāļĨāđāļĄāđāļŦāļĨāļ§āļāļĩāđāđāļāđāļāļĢāļīāļ
āļāļģāđāļĄāļāļķāļāļāļ§āļĢāđāļāđāđāļāļāļāļĢāļīāļāļīāļ§āļāđ data-test āđāļāļ class selector? āļāļ·āđāļ class āđāļāļĨāļĩāđāļĒāļāđāļāļāļēāļĄāļŠāđāļāļĨāđāđāļĨāļ°āđāļāļĢāļāļŠāļĢāđāļēāļ āļāļąāļāļāļąāđāļāđāļāļŠāļāđāļāļĩāđ query āļāļēāļāļĄāļąāļāļāļķāļāļāļąāļāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāđāļāđāđāļāđāļāļīāļāļāļ§āļēāļĄāļŠāļ§āļĒāļāļēāļĄ āļāļēāļĢāđāļāđ hook data-test āđāļāļĒāđāļāļāļēāļ°āļāļ°āđāļŠāļāļāđāļāļāļāļēāļāļāļāļāļēāļĢāļāļāļŠāļāļāļāļĒāđāļēāļāļāļąāļāđāļāļāđāļĨāļ°āļāļĒāļđāđāļĢāļāļāļāđāļēāļāļāļēāļĢ refactor āļāđāļ§āļĒāļĨāļ false negative
āļāļ°āļāļāļŠāļāļ composable āļāļĩāđāļāļķāđāļāļāļē onMounted āļāļĒāđāļēāļāđāļĢ? lifecycle hook āļāļ°āļāļģāļāļēāļāđāļāļāļēāļ°āļ āļēāļĒāđāļ instance āļāļāļāļāļāļĄāđāļāđāļāļāļāđ āļāļąāļāļāļąāđāļāļāļķāļāđāļĢāļĩāļĒāļ composable āđāļāļĒāļāļĢāļāđāļĄāđāđāļāđ āđāļāļāļāļīāļāļĄāļēāļāļĢāļāļēāļāļāļ·āļāļŠāļĢāđāļēāļāļāļāļĄāđāļāđāļāļāļāđ harness āđāļāļāđāļāđāđāļĨāđāļ§āļāļīāđāļāļāļĩāđāđāļĢāļĩāļĒāļ composable āđāļ setup āđāļĨāļ°āđāļāļīāļāļāđāļēāļāļĩāđāļāļ·āļāļāļāļāļĄāļē āļāļēāļāļāļąāđāļāļāļķāļ mount harness āļāļąāđāļāļāđāļ§āļĒ Vue Test Utils āđāļĨāđāļ§āļĒāļ·āļāļĒāļąāļāļāļĨāļāđāļēāļ wrapper āļ§āļīāļāļĩāļāļĩāđāļāļģāđāļŦāđāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ reactivity āđāļĨāļ° lifecycle āļĒāļąāļāļāļāļŠāļĄāļāļđāļĢāļāđāđāļāļāļāļ°āļāļĩāđāļĒāļąāļāđāļĒāļāļāļĢāļĢāļāļ°āļāļĩāđāļāļģāļĨāļąāļāļāļāļŠāļāļāđāļŦāđāļāļīāļŠāļĢāļ° āļāļģāļāļēāļĄāđāļāļīāļāđāļāļ§āļāļīāļāđāļĨāļ°āđāļāļīāļāđāļāļĩāļĒāļāđāļāđāļāđāļāļīāđāļĄāđāļāļīāļĄāļĢāļ§āļāļĢāļ§āļĄāđāļ§āđāđāļāļāļđāđāļĄāļ·āļāļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Vue.js āļāļĩāđāļāļģāđāļāđāļ
āļāļāļŠāļĢāļļāļ
āļāļēāļĢāļāļąāđāļāļāđāļēāļāļēāļĢāļāļāļŠāļāļ Vue āļāļĩāđāđāļāļ·āđāļāļāļ·āļāđāļāđāđāļāļāļĩ 2026 āļŠāļĢāļļāļāļĨāļāđāļŦāļĨāļ·āļāļāļēāļāđāļĨāļ·āļāļāļāļĩāđāļāļīāļāļēāļĢāļāļēāļāļĒāđāļēāļāļāļąāđāļāđāļāđāļĄāđāļāļĩāđāļāđāļ:
- āļĢāļąāļ Vitest āļāđāļ§āļĒ
environment: 'jsdom'āđāļĨāļ°āļāļĨāļąāđāļāļāļīāļ Vue āđāļāļ·āđāļāđāļŦāđāđāļāļŠāļāđāđāļāđ transform pipeline āļāļāļ Vite āļāļļāļāđāļāļĩāļĒāļ§āļāļąāļāļāļąāļ§āđāļāļāđāļāđāļ° - āđāļĨāļ·āļāļ
mountāļĄāļēāļāļāļ§āđāļēshallowMountāđāļ§āđāļāđāļāđāļāļāļĄāđāļāđāļāļāļāđāļĨāļđāļāļāļ°āļŦāļāļąāļāļŦāļĢāļ·āļāļāļđāļāļāļĢāļāļāļāļĨāļļāļĄāđāļ§āđāđāļĨāđāļ§āļāļĩāđāļāļ·āđāļ awaittrigger,setValueāđāļĨāļ°nextTickāđāļŠāļĄāļāļāđāļāļāļĒāļ·āļāļĒāļąāļāļāļĨ āđāļāļ·āđāļāļāļģāļāļąāļāđāļāļŠāļāđāļāļĩāđāļāļĨāļĨāļąāļāļāđāđāļĄāđāđāļāđāļāļāļāđāļĨāļ°āļāļķāđāļāļāļąāļāļāļąāļāļŦāļ§āļ°āđāļ§āļĨāļē- āļāļāļŠāļāļ composable āļāļĩāđāđāļāđāđāļāļĩāļĒāļ reactivity API āļāđāļ§āļĒāļāļēāļĢāđāļĢāļĩāļĒāļāļĄāļąāļāđāļāļĒāļāļĢāļāđāļĨāļ°āļĒāļ·āļāļĒāļąāļāļāļĨāļāļ
.value - mock āļāļĩāđāļāļāļāđāļāļāļāļāļāđāļĄāļāļđāļĨāļāđāļ§āļĒ
vi.mockāđāļāļ·āđāļāđāļŦāđāļāļĪāļāļīāļāļĢāļĢāļĄāđāļāļĢāļ·āļāļāđāļēāļĒāļāļāđāļŠāđāļāļāļāļ§āļēāđāļĨāļ°āļāļāļŠāļāļāđāļŠāđāļāļāļēāļ error āđāļāđ - āđāļāđ
createTestingPinia({ createSpy: vi.fn })āļŠāļģāļŦāļĢāļąāļāđāļāļŠāļāđāļāļāļĄāđāļāđāļāļāļāđ āđāļĨāļ°stubActions: falseāđāļĄāļ·āđāļāļāđāļāļāļāļāļŠāļāļāļāļĢāļĢāļāļ°āļāļāļ store - query element āļāđāļēāļāđāļāļāļāļĢāļīāļāļīāļ§āļāđ
data-testāđāļāļ·āđāļāđāļŦāđāđāļāļŠāļāđāļĨāđāļĄāđāļāļāļēāļ°āđāļĄāļ·āđāļāļāļĪāļāļīāļāļĢāļĢāļĄāļāļĢāļīāļāđāļāļĨāļĩāđāļĒāļ āđāļĄāđāđāļāđāđāļāļĢāļēāļ°āļāļēāļĢāļāļĢāļąāļāļŠāđāļāļĨāđ
āđāļĄāļ·āđāļāđāļāļĩāđāļĒāļ§āļāļēāļāđāļāļāđāļāļīāļĢāđāļāđāļŦāļĨāđāļēāļāļĩāđ āļāļēāļĢāļāļāļŠāļāļāļāļ°āļāļĨāļēāļĒāđāļāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļāļāđāļāļāļĄāļēāļāļāļ§āđāļēāļ āļēāļĢāļ° āļāļĩāđāļāļāļĒāļāļąāļāļāļąāļ regression āļāđāļāļāļāļ°āļŦāļĨāļļāļāđāļāļāļķāļāđāļāļĢāļāļąāļāļāļąāļ āļŠāļģāļĢāļ§āļāđāļŠāđāļāļāļēāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđ Vue āđāļĨāļ° Nuxt āļāļāļąāļāđāļāđāļĄāđāļāļ·āđāļāļŠāļĢāđāļēāļāļāļąāļāļĐāļ°āļāļĩāđāļāļĢāđāļāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđāļāđāļāđāļ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

Vue 3 Composables āļāļąāđāļāļŠāļđāļ: āļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļāđāļģāđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ 2026
āļāļđāđāļĄāļ·āļ Vue 3 Composables āļāļąāđāļāļŠāļđāļāļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ: āļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļāđāļģ āļāļēāļĢāļāļąāļāļāļēāļĢ Async āļāļēāļĢ Inject Dependencies āļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļāļĢāđāļĄ āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāđāļāļāļāļīāļāļāļĩ 2026

Vue 3 Pinia vs Vuex: State Management āļŠāļĄāļąāļĒāđāļŦāļĄāđāđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ 2026
āļ§āļīāđāļāļĢāļēāļ°āļŦāđāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļ Pinia āļāļąāļ Vuex: āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ, TypeScript, Composition API, āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ, āļāļĨāļĒāļļāļāļāđāļāļēāļĢāļĒāđāļēāļĒ āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Vue state management 2026

Nuxt 4 āđāļāļāļĩ 2026: āđāļāļĢāļāļŠāļĢāđāļēāļāđāļāđāļĢāļāļāļāļĢāļĩāđāļŦāļĄāđāđāļĨāļ°āļāļđāđāļĄāļ·āļāļāļēāļĢāļĒāđāļēāļĒāļāļēāļ Nuxt 3
āļāļđāđāļĄāļ·āļāļāļēāļĢāļĒāđāļēāļĒāļāļēāļ Nuxt 3 āđāļāļĒāļąāļ Nuxt 4 āļāļāļąāļāļŠāļĄāļāļđāļĢāļāđ āļāļĢāļāļāļāļĨāļļāļĄāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāđāļĢāļāļāļāļĢāļĩ app/ āđāļŦāļĄāđ singleton data fetching, shallow reactivity āđāļĨāļ°āļāļēāļĢāđāļĒāļāļāļĢāļīāļāļ TypeScript āļāļĢāđāļāļĄāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāļāļĢāļīāļ