--- name: vue-test-utils-skilld description: ALWAYS use when writing, debugging, or reviewing code that imports "@vue/test-utils" or mentions vue test-utils, VTU, mount, shallowMount, findComponent, wrapper queries, or migrating from Vue Test Utils v1. Provides the current API surface, mounting options, wrapper methods, and testing recipes for @vue/test-utils 2.5.1 on Vue 3. --- # @vue/test-utils 2.5.1 (Vue 3) Prepared source: `input/source`, version 2.5.1 (`package.json:3`). Requires Vue 3.x and `@vue/compiler-dom` 3.x as peers; `@vue/server-renderer` 3.x is an optional peer needed only for `renderToString` (`package.json:73-81`). Test-runner agnostic (Vitest, Jest, others). Needs a browser-like DOM environment (jsdom or happy-dom). Install: `npm install @vue/test-utils --save-dev` ## Quick start ```ts import { mount } from '@vue/test-utils' import Counter from './Counter.vue' test('increments', async () => { const wrapper = mount(Counter, { props: { start: 1 } }) await wrapper.find('button').trigger('click') expect(wrapper.text()).toContain('2') }) ``` ## Public API surface Exports from `dist/src/index.d.ts:13`: | Export | Kind | Use | |---|---|---| | `mount` | function | Mount a component, returns `VueWrapper` (`dist/src/mount.d.ts:17`) | | `shallowMount` | function | Same as `mount` with all child components stubbed (`dist/src/mount.d.ts:22`) | | `renderToString` | function | SSR-render a component to a string, `Promise` (`dist/src/renderToString.d.ts:4`) | | `flushPromises` | function | Await pending non-Vue promises (mocked API calls, timers) (`dist/src/utils/flushPromises.d.ts:1`) | | `enableAutoUnmount(hook)` | function | Unmount all wrappers via a test hook (`dist/src/utils/autoUnmount.d.ts:4`) | | `disableAutoUnmount` | function | Stop auto unmounting (`dist/src/utils/autoUnmount.d.ts:3`) | | `VueWrapper` | class | Wrapper around a mounted component instance (`dist/src/vueWrapper.d.ts:5`) | | `DOMWrapper` | class | Wrapper around a DOM element; `new DOMWrapper(document.body)` (`dist/src/domWrapper.d.ts:4`) | | `RouterLinkStub` | component | Stub for `` (`dist/src/components/RouterLinkStub.d.ts:1`) | | `config` | object | Shared default mount options and wrapper plugins (`dist/src/config.d.ts:32`) | | `createWrapperError` | function | Internal; produces the error wrapper returned by `find` misses | ## Core rules - `await` every method that returns a promise: `trigger`, `setValue`, `setProps`, `setData`, `renderToString`, `flushPromises`. Without `await`, assertions run before the DOM updates. - Use `get()` / `getComponent()` when the element must exist; they throw on miss. Use `find()` / `findComponent()` only when absence is a valid outcome; they return an error wrapper whose `exists()` is `false`. - `find()` accepts CSS selectors only. To locate a child component use `findComponent(Component)`, `findComponent({ name: 'Foo' })`, `findComponent({ ref: 'foo' })`, or a CSS selector. - Register `enableAutoUnmount(afterEach)` once in test setup to prevent state leaks between tests. - Use `flushPromises()` for promises Vue does not track (mocked HTTP clients, `setTimeout`). - `wrapper.vm` only reliably exposes what the component exposes: options-API state, `defineExpose()` bindings (since 2.5.0, PR #2927), or `setup()` return values. ```ts import { enableAutoUnmount } from '@vue/test-utils' import { afterEach } from 'vitest' enableAutoUnmount(afterEach) ``` ## Version notes: 2.4.10 -> 2.5.1 - BREAKING (2.5.0): class component support removed. Mount Vue components defined with `defineComponent`, options objects, or `