@vitest-agent/mcp 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/bin/vitest-agent-mcp.js +1 -17
- package/index.d.ts +324 -315
- package/index.js +2 -4
- package/middleware/idempotency.js +1 -1
- package/package.json +2 -2
- package/server.js +2 -4
- package/tools/acceptance-metrics.js +1 -1
- package/tools/cache-health.js +1 -1
- package/tools/commit-changes.js +1 -1
- package/tools/configure.js +1 -1
- package/tools/coverage.js +1 -1
- package/tools/errors.js +1 -1
- package/tools/failure-signature-get.js +1 -1
- package/tools/file-coverage.js +1 -1
- package/tools/history.js +1 -1
- package/tools/inventory.js +1 -1
- package/tools/overview.js +1 -1
- package/tools/run-tests.js +15 -3
- package/tools/settings-list.js +1 -1
- package/tools/status.js +1 -1
- package/tools/tdd-artifact.js +1 -1
- package/tools/tdd-task.js +1 -1
- package/tools/test.js +1 -1
- package/tools/trends.js +1 -1
- package/tools/turn-search.js +1 -1
- package/public/patterns/_meta.json +0 -67
- package/public/patterns/authoring-a-custom-vitest-agent-reporter.md +0 -82
- package/public/patterns/known-issues-and-caveats.md +0 -52
- package/public/patterns/operating-vitest-agent-as-an-agent.md +0 -53
- package/public/patterns/running-tests-via-mcp.md +0 -58
- package/public/patterns/silencing-leaking-output-in-tests.md +0 -91
- package/public/patterns/testing-effect-schema-definitions.md +0 -71
- package/public/patterns/testing-effect-services-with-mock-layers.md +0 -63
- package/public/vendor/vitest-docs/ATTRIBUTION.md +0 -5
- package/public/vendor/vitest-docs/api/advanced/artifacts.md +0 -189
- package/public/vendor/vitest-docs/api/advanced/metadata.md +0 -68
- package/public/vendor/vitest-docs/api/advanced/plugin.md +0 -168
- package/public/vendor/vitest-docs/api/advanced/reporters.md +0 -342
- package/public/vendor/vitest-docs/api/advanced/runner.md +0 -334
- package/public/vendor/vitest-docs/api/advanced/test-case.md +0 -302
- package/public/vendor/vitest-docs/api/advanced/test-collection.md +0 -89
- package/public/vendor/vitest-docs/api/advanced/test-module.md +0 -140
- package/public/vendor/vitest-docs/api/advanced/test-project.md +0 -321
- package/public/vendor/vitest-docs/api/advanced/test-specification.md +0 -96
- package/public/vendor/vitest-docs/api/advanced/test-suite.md +0 -230
- package/public/vendor/vitest-docs/api/advanced/vitest.md +0 -684
- package/public/vendor/vitest-docs/api/assert-type.md +0 -22
- package/public/vendor/vitest-docs/api/assert.md +0 -1960
- package/public/vendor/vitest-docs/api/browser/assertions.md +0 -1277
- package/public/vendor/vitest-docs/api/browser/commands.md +0 -154
- package/public/vendor/vitest-docs/api/browser/context.md +0 -338
- package/public/vendor/vitest-docs/api/browser/interactivity.md +0 -681
- package/public/vendor/vitest-docs/api/browser/locators.md +0 -1171
- package/public/vendor/vitest-docs/api/browser/react.md +0 -346
- package/public/vendor/vitest-docs/api/browser/svelte.md +0 -292
- package/public/vendor/vitest-docs/api/browser/vue.md +0 -222
- package/public/vendor/vitest-docs/api/describe.md +0 -374
- package/public/vendor/vitest-docs/api/expect-typeof.md +0 -571
- package/public/vendor/vitest-docs/api/expect.md +0 -2304
- package/public/vendor/vitest-docs/api/hooks.md +0 -463
- package/public/vendor/vitest-docs/api/mock.md +0 -701
- package/public/vendor/vitest-docs/api/test.md +0 -926
- package/public/vendor/vitest-docs/api/vi.md +0 -1372
- package/public/vendor/vitest-docs/config/alias.md +0 -13
- package/public/vendor/vitest-docs/config/allowonly.md +0 -32
- package/public/vendor/vitest-docs/config/api.md +0 -27
- package/public/vendor/vitest-docs/config/attachmentsdir.md +0 -6
- package/public/vendor/vitest-docs/config/bail.md +0 -9
- package/public/vendor/vitest-docs/config/benchmark.md +0 -65
- package/public/vendor/vitest-docs/config/browser/api.md +0 -23
- package/public/vendor/vitest-docs/config/browser/commands.md +0 -6
- package/public/vendor/vitest-docs/config/browser/connecttimeout.md +0 -10
- package/public/vendor/vitest-docs/config/browser/detailspanelposition.md +0 -38
- package/public/vendor/vitest-docs/config/browser/enabled.md +0 -40
- package/public/vendor/vitest-docs/config/browser/expect.md +0 -250
- package/public/vendor/vitest-docs/config/browser/headless.md +0 -7
- package/public/vendor/vitest-docs/config/browser/instances.md +0 -47
- package/public/vendor/vitest-docs/config/browser/isolate.md +0 -11
- package/public/vendor/vitest-docs/config/browser/locators.md +0 -24
- package/public/vendor/vitest-docs/config/browser/orchestratorscripts.md +0 -39
- package/public/vendor/vitest-docs/config/browser/playwright.md +0 -214
- package/public/vendor/vitest-docs/config/browser/preview.md +0 -32
- package/public/vendor/vitest-docs/config/browser/provider.md +0 -79
- package/public/vendor/vitest-docs/config/browser/screenshotdirectory.md +0 -6
- package/public/vendor/vitest-docs/config/browser/screenshotfailures.md +0 -6
- package/public/vendor/vitest-docs/config/browser/testerhtmlpath.md +0 -5
- package/public/vendor/vitest-docs/config/browser/trace.md +0 -43
- package/public/vendor/vitest-docs/config/browser/trackunhandlederrors.md +0 -10
- package/public/vendor/vitest-docs/config/browser/ui.md +0 -7
- package/public/vendor/vitest-docs/config/browser/viewport.md +0 -6
- package/public/vendor/vitest-docs/config/browser/webdriverio.md +0 -64
- package/public/vendor/vitest-docs/config/cache.md +0 -26
- package/public/vendor/vitest-docs/config/chaiconfig.md +0 -29
- package/public/vendor/vitest-docs/config/clearmocks.md +0 -22
- package/public/vendor/vitest-docs/config/coverage.md +0 -455
- package/public/vendor/vitest-docs/config/css.md +0 -47
- package/public/vendor/vitest-docs/config/dangerouslyignoreunhandlederrors.md +0 -23
- package/public/vendor/vitest-docs/config/deps.md +0 -127
- package/public/vendor/vitest-docs/config/detectasyncleaks.md +0 -39
- package/public/vendor/vitest-docs/config/diff.md +0 -96
- package/public/vendor/vitest-docs/config/dir.md +0 -7
- package/public/vendor/vitest-docs/config/disableconsoleintercept.md +0 -15
- package/public/vendor/vitest-docs/config/env.md +0 -5
- package/public/vendor/vitest-docs/config/environment.md +0 -96
- package/public/vendor/vitest-docs/config/environmentoptions.md +0 -30
- package/public/vendor/vitest-docs/config/exclude.md +0 -49
- package/public/vendor/vitest-docs/config/execargv.md +0 -10
- package/public/vendor/vitest-docs/config/expandsnapshotdiff.md +0 -7
- package/public/vendor/vitest-docs/config/expect.md +0 -38
- package/public/vendor/vitest-docs/config/experimental.md +0 -510
- package/public/vendor/vitest-docs/config/faketimers.md +0 -51
- package/public/vendor/vitest-docs/config/fileparallelism.md +0 -11
- package/public/vendor/vitest-docs/config/forcereruntriggers.md +0 -19
- package/public/vendor/vitest-docs/config/globals.md +0 -42
- package/public/vendor/vitest-docs/config/globalsetup.md +0 -72
- package/public/vendor/vitest-docs/config/hideskippedtests.md +0 -7
- package/public/vendor/vitest-docs/config/hooktimeout.md +0 -7
- package/public/vendor/vitest-docs/config/include-source.md +0 -115
- package/public/vendor/vitest-docs/config/include.md +0 -71
- package/public/vendor/vitest-docs/config/includetasklocation.md +0 -17
- package/public/vendor/vitest-docs/config/index.md +0 -85
- package/public/vendor/vitest-docs/config/isolate.md +0 -13
- package/public/vendor/vitest-docs/config/logheapusage.md +0 -7
- package/public/vendor/vitest-docs/config/maxconcurrency.md +0 -9
- package/public/vendor/vitest-docs/config/maxworkers.md +0 -49
- package/public/vendor/vitest-docs/config/mockreset.md +0 -22
- package/public/vendor/vitest-docs/config/mode.md +0 -7
- package/public/vendor/vitest-docs/config/name.md +0 -111
- package/public/vendor/vitest-docs/config/onconsolelog.md +0 -25
- package/public/vendor/vitest-docs/config/onstacktrace.md +0 -32
- package/public/vendor/vitest-docs/config/onunhandlederror.md +0 -35
- package/public/vendor/vitest-docs/config/open.md +0 -7
- package/public/vendor/vitest-docs/config/outputfile.md +0 -7
- package/public/vendor/vitest-docs/config/passwithnotests.md +0 -7
- package/public/vendor/vitest-docs/config/pool.md +0 -45
- package/public/vendor/vitest-docs/config/printconsoletrace.md +0 -6
- package/public/vendor/vitest-docs/config/projects.md +0 -6
- package/public/vendor/vitest-docs/config/provide.md +0 -45
- package/public/vendor/vitest-docs/config/reporters.md +0 -69
- package/public/vendor/vitest-docs/config/resolvesnapshotpath.md +0 -36
- package/public/vendor/vitest-docs/config/restoremocks.md +0 -22
- package/public/vendor/vitest-docs/config/retry.md +0 -140
- package/public/vendor/vitest-docs/config/root.md +0 -6
- package/public/vendor/vitest-docs/config/runner.md +0 -6
- package/public/vendor/vitest-docs/config/sequence.md +0 -158
- package/public/vendor/vitest-docs/config/server.md +0 -68
- package/public/vendor/vitest-docs/config/setupfiles.md +0 -40
- package/public/vendor/vitest-docs/config/silent.md +0 -9
- package/public/vendor/vitest-docs/config/slowtestthreshold.md +0 -7
- package/public/vendor/vitest-docs/config/snapshotenvironment.md +0 -27
- package/public/vendor/vitest-docs/config/snapshotformat.md +0 -28
- package/public/vendor/vitest-docs/config/snapshotserializers.md +0 -6
- package/public/vendor/vitest-docs/config/stricttags.md +0 -30
- package/public/vendor/vitest-docs/config/tags.md +0 -141
- package/public/vendor/vitest-docs/config/teardowntimeout.md +0 -7
- package/public/vendor/vitest-docs/config/testnamepattern.md +0 -21
- package/public/vendor/vitest-docs/config/testtimeout.md +0 -7
- package/public/vendor/vitest-docs/config/typecheck.md +0 -77
- package/public/vendor/vitest-docs/config/ui.md +0 -15
- package/public/vendor/vitest-docs/config/unstubenvs.md +0 -20
- package/public/vendor/vitest-docs/config/unstubglobals.md +0 -20
- package/public/vendor/vitest-docs/config/update.md +0 -16
- package/public/vendor/vitest-docs/config/vmmemorylimit.md +0 -30
- package/public/vendor/vitest-docs/config/watch.md +0 -11
- package/public/vendor/vitest-docs/config/watchtriggerpatterns.md +0 -29
- package/public/vendor/vitest-docs/guide/advanced/index.md +0 -147
- package/public/vendor/vitest-docs/guide/advanced/pool.md +0 -148
- package/public/vendor/vitest-docs/guide/advanced/reporters.md +0 -93
- package/public/vendor/vitest-docs/guide/advanced/tests.md +0 -125
- package/public/vendor/vitest-docs/guide/browser/aria-snapshots.md +0 -470
- package/public/vendor/vitest-docs/guide/browser/component-testing.md +0 -571
- package/public/vendor/vitest-docs/guide/browser/index.md +0 -630
- package/public/vendor/vitest-docs/guide/browser/multiple-setups.md +0 -121
- package/public/vendor/vitest-docs/guide/browser/trace-view.md +0 -126
- package/public/vendor/vitest-docs/guide/browser/visual-regression-testing.md +0 -734
- package/public/vendor/vitest-docs/guide/cli-generated.md +0 -972
- package/public/vendor/vitest-docs/guide/cli.md +0 -234
- package/public/vendor/vitest-docs/guide/common-errors.md +0 -163
- package/public/vendor/vitest-docs/guide/coverage.md +0 -515
- package/public/vendor/vitest-docs/guide/debugging.md +0 -127
- package/public/vendor/vitest-docs/guide/environment.md +0 -101
- package/public/vendor/vitest-docs/guide/extending-matchers.md +0 -160
- package/public/vendor/vitest-docs/guide/features.md +0 -310
- package/public/vendor/vitest-docs/guide/filtering.md +0 -175
- package/public/vendor/vitest-docs/guide/ide.md +0 -43
- package/public/vendor/vitest-docs/guide/improving-performance.md +0 -245
- package/public/vendor/vitest-docs/guide/in-source.md +0 -159
- package/public/vendor/vitest-docs/guide/index.md +0 -128
- package/public/vendor/vitest-docs/guide/learn/async.md +0 -147
- package/public/vendor/vitest-docs/guide/learn/debugging-tests.md +0 -210
- package/public/vendor/vitest-docs/guide/learn/matchers.md +0 -277
- package/public/vendor/vitest-docs/guide/learn/mock-functions.md +0 -277
- package/public/vendor/vitest-docs/guide/learn/setup-teardown.md +0 -240
- package/public/vendor/vitest-docs/guide/learn/snapshots.md +0 -166
- package/public/vendor/vitest-docs/guide/learn/testing-in-practice.md +0 -430
- package/public/vendor/vitest-docs/guide/learn/writing-tests-with-ai.md +0 -127
- package/public/vendor/vitest-docs/guide/learn/writing-tests.md +0 -231
- package/public/vendor/vitest-docs/guide/lifecycle.md +0 -379
- package/public/vendor/vitest-docs/guide/migration.md +0 -863
- package/public/vendor/vitest-docs/guide/mocking/classes.md +0 -158
- package/public/vendor/vitest-docs/guide/mocking/dates.md +0 -52
- package/public/vendor/vitest-docs/guide/mocking/file-system.md +0 -74
- package/public/vendor/vitest-docs/guide/mocking/functions.md +0 -61
- package/public/vendor/vitest-docs/guide/mocking/globals.md +0 -20
- package/public/vendor/vitest-docs/guide/mocking/modules.md +0 -414
- package/public/vendor/vitest-docs/guide/mocking/requests.md +0 -114
- package/public/vendor/vitest-docs/guide/mocking/timers.md +0 -48
- package/public/vendor/vitest-docs/guide/mocking.md +0 -239
- package/public/vendor/vitest-docs/guide/open-telemetry.md +0 -156
- package/public/vendor/vitest-docs/guide/parallelism.md +0 -82
- package/public/vendor/vitest-docs/guide/profiling-test-performance.md +0 -243
- package/public/vendor/vitest-docs/guide/projects.md +0 -291
- package/public/vendor/vitest-docs/guide/recipes.md +0 -59
- package/public/vendor/vitest-docs/guide/reporters.md +0 -723
- package/public/vendor/vitest-docs/guide/snapshot.md +0 -620
- package/public/vendor/vitest-docs/guide/test-annotations.md +0 -103
- package/public/vendor/vitest-docs/guide/test-context.md +0 -902
- package/public/vendor/vitest-docs/guide/test-tags.md +0 -314
- package/public/vendor/vitest-docs/guide/testing-types.md +0 -149
- package/public/vendor/vitest-docs/guide/ui.md +0 -160
- package/public/vendor/vitest-docs/guide/using-plugins.md +0 -5
- package/public/vendor/vitest-docs/manifest.json +0 -1691
- package/resources/index.js +0 -166
- package/resources/indexes.js +0 -77
- package/resources/manifest-schema.js +0 -46
- package/resources/paths.js +0 -20
- package/resources/patterns.js +0 -22
- package/resources/upstream-docs.js +0 -22
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
# Setup and Teardown
|
|
2
|
-
|
|
3
|
-
Often while writing tests, you need to do some work before tests run (initialize data, connect to a database, start a server) and clean up afterwards. Rather than duplicating this code in every test, Vitest provides lifecycle hooks that run automatically at the right time.
|
|
4
|
-
|
|
5
|
-
## Repeating Setup for Each Test
|
|
6
|
-
|
|
7
|
-
The most common hooks are [`beforeEach`](/api/hooks#beforeeach) and [`afterEach`](/api/hooks#aftereach). As the names suggest, `beforeEach` runs before every test in the file, and `afterEach` runs after every test, even if the test fails. This makes them perfect for ensuring each test starts with a known state.
|
|
8
|
-
|
|
9
|
-
```js
|
|
10
|
-
import { afterEach, beforeEach, expect, test } from 'vitest'
|
|
11
|
-
|
|
12
|
-
let items
|
|
13
|
-
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
items = ['apple', 'banana', 'cherry']
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
afterEach(() => {
|
|
19
|
-
items = []
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
test('items starts with 3 fruits', () => {
|
|
23
|
-
expect(items).toHaveLength(3)
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
test('can add an item', () => {
|
|
27
|
-
items.push('date')
|
|
28
|
-
expect(items).toHaveLength(4)
|
|
29
|
-
// afterEach will reset items for the next test,
|
|
30
|
-
// so this mutation won't leak into other tests
|
|
31
|
-
})
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Without these hooks, the second test's `push` would affect any test that runs after it, which is a classic source of flaky tests. The hooks guarantee clean state for every test.
|
|
35
|
-
|
|
36
|
-
## One-Time Setup
|
|
37
|
-
|
|
38
|
-
Some setup is too expensive to repeat for every test. If you need to connect to a database, start a server, or load a large file, doing that before every test would slow your suite down dramatically. That's what [`beforeAll`](/api/hooks#beforeall) and [`afterAll`](/api/hooks#afterall) are for. They run once for the entire file:
|
|
39
|
-
|
|
40
|
-
```js
|
|
41
|
-
import { afterAll, beforeAll, expect, test } from 'vitest'
|
|
42
|
-
|
|
43
|
-
let db
|
|
44
|
-
|
|
45
|
-
beforeAll(async () => {
|
|
46
|
-
db = await connectToDatabase()
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
afterAll(async () => {
|
|
50
|
-
await db.close()
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
test('can query users', async () => {
|
|
54
|
-
const users = await db.query('SELECT * FROM users')
|
|
55
|
-
expect(users.length).toBeGreaterThan(0)
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
test('can query products', async () => {
|
|
59
|
-
const products = await db.query('SELECT * FROM products')
|
|
60
|
-
expect(products.length).toBeGreaterThan(0)
|
|
61
|
-
})
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
The database connection is created once, shared across all tests, and then closed when the file finishes running.
|
|
65
|
-
|
|
66
|
-
## Scoping with `describe`
|
|
67
|
-
|
|
68
|
-
Hooks defined inside a `describe` block only apply to the tests within that block. Top-level hooks apply to every test in the file. This lets you set up different state for different groups of tests:
|
|
69
|
-
|
|
70
|
-
```js
|
|
71
|
-
import { beforeEach, describe, expect, test } from 'vitest'
|
|
72
|
-
|
|
73
|
-
describe('math operations', () => {
|
|
74
|
-
let value
|
|
75
|
-
|
|
76
|
-
beforeEach(() => {
|
|
77
|
-
value = 0
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
test('can add', () => {
|
|
81
|
-
value += 5
|
|
82
|
-
expect(value).toBe(5)
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
test('can subtract', () => {
|
|
86
|
-
value -= 3
|
|
87
|
-
expect(value).toBe(-3) // value was reset to 0 by beforeEach
|
|
88
|
-
})
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
describe('string operations', () => {
|
|
92
|
-
let text
|
|
93
|
-
|
|
94
|
-
beforeEach(() => {
|
|
95
|
-
text = 'hello'
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
test('can uppercase', () => {
|
|
99
|
-
expect(text.toUpperCase()).toBe('HELLO')
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Each `describe` block has its own `beforeEach` that only affects the tests inside it. The string tests don't know or care about the `value` variable, and vice versa.
|
|
105
|
-
|
|
106
|
-
## Execution Order
|
|
107
|
-
|
|
108
|
-
When you have hooks at multiple levels, it's helpful to understand the order they run in. Top-level hooks wrap around inner hooks, forming a nesting structure:
|
|
109
|
-
|
|
110
|
-
```js
|
|
111
|
-
import { afterAll, afterEach, beforeAll, beforeEach, describe, test } from 'vitest'
|
|
112
|
-
|
|
113
|
-
beforeAll(() => console.log('1 - beforeAll'))
|
|
114
|
-
afterAll(() => console.log('8 - afterAll'))
|
|
115
|
-
beforeEach(() => console.log('2 - beforeEach'))
|
|
116
|
-
afterEach(() => console.log('5 - afterEach'))
|
|
117
|
-
|
|
118
|
-
describe('suite', () => {
|
|
119
|
-
beforeEach(() => console.log('3 - inner beforeEach'))
|
|
120
|
-
afterEach(() => console.log('4 - inner afterEach'))
|
|
121
|
-
|
|
122
|
-
test('first test', () => {
|
|
123
|
-
console.log(' first test')
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
test('second test', () => {
|
|
127
|
-
console.log(' second test')
|
|
128
|
-
})
|
|
129
|
-
})
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
This produces the following output:
|
|
133
|
-
|
|
134
|
-
```
|
|
135
|
-
1 - beforeAll
|
|
136
|
-
2 - beforeEach
|
|
137
|
-
3 - inner beforeEach
|
|
138
|
-
first test
|
|
139
|
-
4 - inner afterEach
|
|
140
|
-
5 - afterEach
|
|
141
|
-
2 - beforeEach
|
|
142
|
-
3 - inner beforeEach
|
|
143
|
-
second test
|
|
144
|
-
4 - inner afterEach
|
|
145
|
-
5 - afterEach
|
|
146
|
-
8 - afterAll
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
Notice the pattern: `beforeAll` and `afterAll` run once for the entire suite, while `beforeEach` and `afterEach` repeat for every test. Within each test, outer `beforeEach` runs first (setting up the broadest context), then inner `beforeEach` runs (narrowing the context). After the test, the order reverses: inner `afterEach` cleans up the narrow context first, then outer `afterEach` handles the broader cleanup.
|
|
150
|
-
|
|
151
|
-
## Cleanup with `onTestFinished`
|
|
152
|
-
|
|
153
|
-
Sometimes you create a resource inside a test that needs to be cleaned up afterwards. You could use `afterEach`, but that means the cleanup is separated from the setup, which can make the test harder to follow. [`onTestFinished`](/api/hooks#ontestfinished) lets you register a cleanup function right where you create the resource:
|
|
154
|
-
|
|
155
|
-
```js
|
|
156
|
-
import { expect, onTestFinished, test } from 'vitest'
|
|
157
|
-
|
|
158
|
-
test('creates a temporary file', () => {
|
|
159
|
-
const file = createTempFile()
|
|
160
|
-
onTestFinished(() => {
|
|
161
|
-
deleteTempFile(file)
|
|
162
|
-
})
|
|
163
|
-
|
|
164
|
-
expect(file.exists()).toBe(true)
|
|
165
|
-
})
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
A similar pattern works with `beforeEach`. You can return a cleanup function and Vitest will call it after each test. This is especially nice when the setup and teardown are closely related:
|
|
169
|
-
|
|
170
|
-
```js
|
|
171
|
-
import { beforeEach } from 'vitest'
|
|
172
|
-
|
|
173
|
-
beforeEach(() => {
|
|
174
|
-
const server = startServer()
|
|
175
|
-
return () => {
|
|
176
|
-
server.close()
|
|
177
|
-
}
|
|
178
|
-
})
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## Fixtures with `test.extend`
|
|
182
|
-
|
|
183
|
-
The examples above use `let` variables and `beforeEach` to set up shared state. This works, but it has some downsides: the variable declarations are separated from the initialization, the types require explicit annotation, and it's easy to forget to clean up.
|
|
184
|
-
|
|
185
|
-
Vitest offers a better pattern for this with [`test.extend`](/guide/test-context#extend-test-context). You define reusable **fixtures** that are automatically created for each test and cleaned up afterwards:
|
|
186
|
-
|
|
187
|
-
```js [my-test.js]
|
|
188
|
-
import { test as baseTest } from 'vitest'
|
|
189
|
-
|
|
190
|
-
export const test = baseTest
|
|
191
|
-
.extend('db', async ({}, { onCleanup }) => {
|
|
192
|
-
const db = await createDatabase()
|
|
193
|
-
onCleanup(() => db.close())
|
|
194
|
-
return db
|
|
195
|
-
})
|
|
196
|
-
.extend('user', async ({ db }) => {
|
|
197
|
-
return await db.createUser({ name: 'Alice' })
|
|
198
|
-
})
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
```js [my-test.test.js]
|
|
202
|
-
import { expect } from 'vitest'
|
|
203
|
-
import { test } from './my-test.js'
|
|
204
|
-
|
|
205
|
-
test('user is created', ({ db, user }) => {
|
|
206
|
-
expect(user.name).toBe('Alice')
|
|
207
|
-
})
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
Fixtures are only initialized when a test actually uses them (by destructuring them from the context), and they can depend on each other. This makes them a great alternative to `beforeEach`/`afterEach` for most setup and teardown patterns.
|
|
211
|
-
|
|
212
|
-
See the [Test Context](/guide/test-context) guide for the full details on fixtures, scoping, and overrides.
|
|
213
|
-
|
|
214
|
-
## Setup Files
|
|
215
|
-
|
|
216
|
-
If you have setup code that should run before every test file in your project (things like polyfills, global configuration, or custom matchers), you can put it in a setup file and point to it with the [`setupFiles`](/config/setupfiles) config option:
|
|
217
|
-
|
|
218
|
-
```js [vitest.config.js]
|
|
219
|
-
import { defineConfig } from 'vitest/config'
|
|
220
|
-
|
|
221
|
-
export default defineConfig({
|
|
222
|
-
test: {
|
|
223
|
-
setupFiles: ['./test/setup.js'],
|
|
224
|
-
},
|
|
225
|
-
})
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
```js [test/setup.js]
|
|
229
|
-
// This runs before every test file
|
|
230
|
-
import { expect } from 'vitest'
|
|
231
|
-
import { customMatchers } from './custom-matchers.js'
|
|
232
|
-
|
|
233
|
-
expect.extend(customMatchers)
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
Unlike `beforeAll`, which runs once per file, setup files run in a separate phase before the test file even starts being collected. This makes them the right place for things like extending the `expect` API or configuring global polyfills.
|
|
237
|
-
|
|
238
|
-
::: tip
|
|
239
|
-
For advanced cases where your test needs to run *inside* a wrapping context (like a database transaction or a tracing span), see the [`aroundEach`](/api/hooks#aroundeach) and [`aroundAll`](/api/hooks#aroundall) hooks. For the complete lifecycle picture, see [Test Run Lifecycle](/guide/lifecycle).
|
|
240
|
-
:::
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
# Snapshot Testing
|
|
2
|
-
|
|
3
|
-
Snapshot tests capture the output of a piece of code and save it to a file. On subsequent runs, the output is compared against the saved snapshot. If the output changes, the test fails. Either the change is a bug, or the snapshot needs to be updated.
|
|
4
|
-
|
|
5
|
-
This approach is particularly useful when you're testing something that produces structured output: a function that returns a complex object, a component that renders HTML, or an error formatter that produces multi-line messages. Writing manual assertions for every field or line would be tedious and fragile. Instead, you capture the entire output once, and let Vitest tell you if it ever changes.
|
|
6
|
-
|
|
7
|
-
## Your First Snapshot
|
|
8
|
-
|
|
9
|
-
To create a snapshot test, pass a value to [`toMatchSnapshot()`](/api/expect#tomatchsnapshot):
|
|
10
|
-
|
|
11
|
-
```js
|
|
12
|
-
import { expect, test } from 'vitest'
|
|
13
|
-
|
|
14
|
-
function generateGreeting(name) {
|
|
15
|
-
return {
|
|
16
|
-
message: `Hello, ${name}!`,
|
|
17
|
-
timestamp: null,
|
|
18
|
-
version: 2,
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
test('generates a greeting', () => {
|
|
23
|
-
expect(generateGreeting('Alice')).toMatchSnapshot()
|
|
24
|
-
})
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
The first time you run this test, there's no existing snapshot to compare against, so Vitest creates one. It stores the snapshot in a `__snapshots__` directory next to your test file:
|
|
28
|
-
|
|
29
|
-
```
|
|
30
|
-
__snapshots__/
|
|
31
|
-
example.test.js.snap
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
If you open that file, you'll see a serialized representation of the value:
|
|
35
|
-
|
|
36
|
-
```js
|
|
37
|
-
exports['generates a greeting 1'] = `
|
|
38
|
-
{
|
|
39
|
-
"message": "Hello, Alice!",
|
|
40
|
-
"timestamp": null,
|
|
41
|
-
"version": 2,
|
|
42
|
-
}
|
|
43
|
-
`
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
From now on, every time you run this test, Vitest serializes the output of `generateGreeting('Alice')` and compares it character-by-character against this stored snapshot. If the output changes (say, someone modifies the message format or bumps the version number), the test fails and shows a clear diff of what changed.
|
|
47
|
-
|
|
48
|
-
::: tip
|
|
49
|
-
Commit your snapshot files to version control. They serve as a record of the expected output and should be reviewed in code review just like any other test assertion.
|
|
50
|
-
:::
|
|
51
|
-
|
|
52
|
-
## Inline Snapshots
|
|
53
|
-
|
|
54
|
-
External snapshot files work well, but they mean you have to jump to a different file to see what the expected output actually looks like. For smaller values, it's often more convenient to keep the snapshot right in your test file with [`toMatchInlineSnapshot()`](/api/expect#tomatchinlinesnapshot).
|
|
55
|
-
|
|
56
|
-
Start by writing the assertion without any argument:
|
|
57
|
-
|
|
58
|
-
```js
|
|
59
|
-
test('generates a greeting', () => {
|
|
60
|
-
expect(generateGreeting('Alice')).toMatchInlineSnapshot()
|
|
61
|
-
})
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
When you run the test, Vitest will **automatically fill in** the snapshot as a string argument:
|
|
65
|
-
|
|
66
|
-
```js
|
|
67
|
-
test('generates a greeting', () => {
|
|
68
|
-
expect(generateGreeting('Alice')).toMatchInlineSnapshot(`
|
|
69
|
-
{
|
|
70
|
-
"message": "Hello, Alice!",
|
|
71
|
-
"timestamp": null,
|
|
72
|
-
"version": 2,
|
|
73
|
-
}
|
|
74
|
-
`)
|
|
75
|
-
})
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Now the expected output lives right next to the code that produces it. You can read the test and immediately understand what `generateGreeting` is expected to return. When the output changes, Vitest updates the string in place, so you don't need to manage separate snapshot files.
|
|
79
|
-
|
|
80
|
-
Inline snapshots are great for small, focused values. For large outputs (like a full HTML page), external snapshots or file snapshots are a better fit.
|
|
81
|
-
|
|
82
|
-
::: tip
|
|
83
|
-
Unlike external snapshots, inline snapshots don't create separate `.snap` files. The expected value is stored directly in your test file as the argument to `toMatchInlineSnapshot()`, so there's nothing extra to commit.
|
|
84
|
-
:::
|
|
85
|
-
|
|
86
|
-
## Updating Snapshots
|
|
87
|
-
|
|
88
|
-
When you intentionally change the output of your code, existing snapshots will be outdated and the tests will fail. This is by design; it's the whole point of snapshot testing. But once you've verified that the new output is correct, you need to update the snapshots.
|
|
89
|
-
|
|
90
|
-
There are several ways to do this:
|
|
91
|
-
|
|
92
|
-
- **In watch mode**: press `u` in the terminal to update all failed snapshots
|
|
93
|
-
- **From the CLI**: run `vitest -u` or `vitest --update` to update snapshots and exit
|
|
94
|
-
- **In VS Code**: use the "Update Snapshots" command on the test gutter icon from the [Vitest extension](https://vitest.dev/vscode)
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
vitest -u
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
For inline snapshots, Vitest modifies your test file directly with the new values. For external snapshots, it rewrites the `.snap` file.
|
|
101
|
-
|
|
102
|
-
::: warning
|
|
103
|
-
Be careful when updating snapshots. Always review the diff to confirm the changes are intentional and not a bug. It's easy to accidentally accept a broken output by blindly pressing `u`.
|
|
104
|
-
:::
|
|
105
|
-
|
|
106
|
-
## File Snapshots
|
|
107
|
-
|
|
108
|
-
Sometimes the output you're testing is large enough that even an external `.snap` file feels awkward, or you want to view the snapshot with proper syntax highlighting in your editor. [`toMatchFileSnapshot()`](/api/expect#tomatchfilesnapshot) lets you save the snapshot to a file with any extension you want:
|
|
109
|
-
|
|
110
|
-
```js
|
|
111
|
-
test('renders the component', async () => {
|
|
112
|
-
const html = renderComponent()
|
|
113
|
-
await expect(html).toMatchFileSnapshot('./fixtures/component.html')
|
|
114
|
-
})
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
The snapshot is stored as a plain `.html` file that you can open in a browser, view with syntax highlighting, or diff with standard tools. This works well for HTML, SVG, CSS, generated code, or any output where the file format matters for readability.
|
|
118
|
-
|
|
119
|
-
## When to Use Snapshots
|
|
120
|
-
|
|
121
|
-
Snapshots shine when you're working with structured, serializable output that would be painful to assert on manually. Some common use cases:
|
|
122
|
-
|
|
123
|
-
- A function that returns a complex configuration object with many nested fields
|
|
124
|
-
- HTML or markup generated by a rendering function or template engine
|
|
125
|
-
- Error messages that include formatted stack traces or context information
|
|
126
|
-
- CLI output or log messages with specific formatting
|
|
127
|
-
- JSON API responses where you want to catch any unexpected field changes
|
|
128
|
-
|
|
129
|
-
On the other hand, snapshots are not always the best tool. If the output changes frequently (for instance, it includes timestamps or random IDs), you'll spend more time updating snapshots than they save you. And if you only care about one or two specific fields, a targeted assertion like [`toMatchObject`](/api/expect#tomatchobject) or [`toHaveProperty`](/api/expect#tohaveproperty) expresses your intent more clearly than a snapshot that captures everything.
|
|
130
|
-
|
|
131
|
-
The general rule: use snapshots when you want to protect against *any* change in the output, and use targeted assertions when you only care about *specific* properties.
|
|
132
|
-
|
|
133
|
-
## Handling Dynamic Values
|
|
134
|
-
|
|
135
|
-
If your output includes values that change every run (like timestamps or IDs), you can use property matchers to pin the structure while ignoring volatile fields. Pass an object with asymmetric matchers as the first argument to `toMatchSnapshot()` or `toMatchInlineSnapshot()`:
|
|
136
|
-
|
|
137
|
-
```js
|
|
138
|
-
test('user snapshot with dynamic fields', () => {
|
|
139
|
-
const user = createUser('Alice')
|
|
140
|
-
|
|
141
|
-
expect(user).toMatchSnapshot({
|
|
142
|
-
id: expect.any(Number),
|
|
143
|
-
createdAt: expect.any(Date),
|
|
144
|
-
})
|
|
145
|
-
})
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
The `id` and `createdAt` fields are checked against the matchers (any number, any date) instead of being compared to a stored value. All other fields are snapshotted as usual.
|
|
149
|
-
|
|
150
|
-
## Error Snapshots
|
|
151
|
-
|
|
152
|
-
A common use of inline snapshots is capturing error messages. [`toThrowErrorMatchingInlineSnapshot`](/api/expect#tothrowerrormatchinginlinesnapshot) combines `toThrow` with `toMatchInlineSnapshot` so you can snapshot the error message without a separate `.snap` file:
|
|
153
|
-
|
|
154
|
-
```js
|
|
155
|
-
test('throws on invalid input', () => {
|
|
156
|
-
expect(() => parse('')).toThrowErrorMatchingInlineSnapshot(
|
|
157
|
-
`[Error: Unexpected end of input at position 0]`
|
|
158
|
-
)
|
|
159
|
-
})
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
This is especially handy for verifying that error messages are clear and don't accidentally change. Like other inline snapshots, Vitest fills in the string on the first run and updates it when you press `u`.
|
|
163
|
-
|
|
164
|
-
::: tip
|
|
165
|
-
For custom snapshot serializers, snapshot matchers, and advanced configuration, see the [Snapshot](/guide/snapshot) guide.
|
|
166
|
-
:::
|