Skip to content

Commit 1e4aa8e

Browse files
authored
fix(runner): improve fixture error messages (#4673)
1 parent 082c37a commit 1e4aa8e

File tree

4 files changed

+27
-14
lines changed

4 files changed

+27
-14
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
"test": "vitest --api -r test/core",
2727
"test:run": "vitest run -r test/core",
2828
"test:all": "CI=true pnpm -r --stream run test --allowOnly",
29-
"test:ci": "CI=true pnpm -r --stream --filter !test-fails --filter !test-browser --filter !test-esm --filter !test-browser run test --allowOnly",
30-
"test:ci:vm-threads": "CI=true pnpm -r --stream --filter !test-fails --filter !test-coverage --filter !test-single-thread --filter !test-browser --filter !test-esm --filter !test-browser --filter !example-react-testing-lib-msw run test --allowOnly --pool vmThreads",
31-
"test:ci:no-threads": "CI=true pnpm -r --stream --filter !test-fails --filter !test-vm-threads --filter !test-coverage --filter !test-watch --filter !test-bail --filter !test-esm --filter !test-browser run test --allowOnly --pool forks",
29+
"test:ci": "CI=true pnpm -r --stream --filter !test-browser --filter !test-esm --filter !test-browser run test --allowOnly",
30+
"test:ci:vm-threads": "CI=true pnpm -r --stream --filter !test-coverage --filter !test-single-thread --filter !test-browser --filter !test-esm --filter !test-browser --filter !example-react-testing-lib-msw run test --allowOnly --pool vmThreads",
31+
"test:ci:no-threads": "CI=true pnpm -r --stream --filter !test-vm-threads --filter !test-coverage --filter !test-watch --filter !test-bail --filter !test-esm --filter !test-browser run test --allowOnly --pool forks",
3232
"typecheck": "tsc -p tsconfig.check.json --noEmit",
3333
"typecheck:why": "tsc -p tsconfig.check.json --noEmit --explainFiles > explainTypes.txt",
3434
"ui:build": "vite build packages/ui",

packages/runner/src/fixture.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ function resolveDeps(fixtures: FixtureItem[], depSet = new Set<FixtureItem>(), p
133133
return
134134
}
135135
if (depSet.has(fixture))
136-
throw new Error('circular fixture dependency')
136+
throw new Error(`Circular fixture dependency detected: ${fixture.prop} <- ${[...depSet].reverse().map(d => d.prop).join(' <- ')}`)
137137

138138
depSet.add(fixture)
139139
resolveDeps(fixture.deps, depSet, pendingFixtures)
@@ -155,7 +155,7 @@ function getUsedProps(fn: Function) {
155155

156156
const first = args[0]
157157
if (!(first.startsWith('{') && first.endsWith('}')))
158-
throw new Error('the first argument must use object destructuring pattern')
158+
throw new Error(`The first argument inside a fixture must use object destructuring pattern, e.g. ({ test } => {}). Instead, received "${first}".`)
159159

160160
const _first = first.slice(1, -1).replace(/\s/g, '')
161161
const props = splitByComma(_first).map((prop) => {
@@ -164,7 +164,7 @@ function getUsedProps(fn: Function) {
164164

165165
const last = props.at(-1)
166166
if (last && last.startsWith('...'))
167-
throw new Error('Rest parameters are not supported')
167+
throw new Error(`Rest parameters are not supported in fixtures, received "${last}".`)
168168

169169
return props
170170
}

test/fails/fixtures/test-extend/fixture-error.test.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { afterEach, beforeEach, describe, expectTypeOf, test } from 'vitest'
1+
import { afterEach, beforeEach, describe, expectTypeOf, test, expect } from 'vitest'
22

33
describe('error thrown in beforeEach fixtures', () => {
44
const myTest = test.extend<{ a: never }>({
@@ -38,3 +38,16 @@ describe('error thrown in test fixtures', () => {
3838
// eslint-disable-next-line unused-imports/no-unused-vars
3939
myTest('fixture errors', ({ a }) => {})
4040
})
41+
42+
// TODO: enable when #4669 is fixed
43+
describe.skip('correctly fails when test times out', () => {
44+
const myTest = test.extend<{ a: number }>({
45+
a: async ({}, use) => {
46+
await use(2)
47+
},
48+
})
49+
myTest('test times out', async ({ a }) => {
50+
await new Promise((resolve) => setTimeout(resolve, 1000))
51+
expect(a).toBe(2)
52+
}, 20)
53+
})

test/fails/test/__snapshots__/runner.test.ts.snap

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,25 +40,25 @@ TypeError: failure
4040
TypeError: failure"
4141
`;
4242
43-
exports[`should fail test-extend/circular-dependency.test.ts > test-extend/circular-dependency.test.ts 1`] = `"Error: circular fixture dependency"`;
43+
exports[`should fail test-extend/circular-dependency.test.ts > test-extend/circular-dependency.test.ts 1`] = `"Error: Circular fixture dependency detected: a <- b <- a"`;
4444
4545
exports[`should fail test-extend/fixture-error.test.ts > test-extend/fixture-error.test.ts 1`] = `
4646
"Error: Error thrown in test fixture
4747
Error: Error thrown in afterEach fixture
4848
Error: Error thrown in beforeEach fixture"
4949
`;
5050
51-
exports[`should fail test-extend/fixture-rest-params.test.ts > test-extend/fixture-rest-params.test.ts 1`] = `"Error: the first argument must use object destructuring pattern"`;
51+
exports[`should fail test-extend/fixture-rest-params.test.ts > test-extend/fixture-rest-params.test.ts 1`] = `"Error: The first argument inside a fixture must use object destructuring pattern, e.g. ({ test } => {}). Instead, received "...rest"."`;
5252
53-
exports[`should fail test-extend/fixture-rest-props.test.ts > test-extend/fixture-rest-props.test.ts 1`] = `"Error: Rest parameters are not supported"`;
53+
exports[`should fail test-extend/fixture-rest-props.test.ts > test-extend/fixture-rest-props.test.ts 1`] = `"Error: Rest parameters are not supported in fixtures, received "...rest"."`;
5454
55-
exports[`should fail test-extend/fixture-without-destructuring.test.ts > test-extend/fixture-without-destructuring.test.ts 1`] = `"Error: the first argument must use object destructuring pattern"`;
55+
exports[`should fail test-extend/fixture-without-destructuring.test.ts > test-extend/fixture-without-destructuring.test.ts 1`] = `"Error: The first argument inside a fixture must use object destructuring pattern, e.g. ({ test } => {}). Instead, received "context"."`;
5656
57-
exports[`should fail test-extend/test-rest-params.test.ts > test-extend/test-rest-params.test.ts 1`] = `"Error: the first argument must use object destructuring pattern"`;
57+
exports[`should fail test-extend/test-rest-params.test.ts > test-extend/test-rest-params.test.ts 1`] = `"Error: The first argument inside a fixture must use object destructuring pattern, e.g. ({ test } => {}). Instead, received "...rest"."`;
5858
59-
exports[`should fail test-extend/test-rest-props.test.ts > test-extend/test-rest-props.test.ts 1`] = `"Error: Rest parameters are not supported"`;
59+
exports[`should fail test-extend/test-rest-props.test.ts > test-extend/test-rest-props.test.ts 1`] = `"Error: Rest parameters are not supported in fixtures, received "...rest"."`;
6060
61-
exports[`should fail test-extend/test-without-destructuring.test.ts > test-extend/test-without-destructuring.test.ts 1`] = `"Error: the first argument must use object destructuring pattern"`;
61+
exports[`should fail test-extend/test-without-destructuring.test.ts > test-extend/test-without-destructuring.test.ts 1`] = `"Error: The first argument inside a fixture must use object destructuring pattern, e.g. ({ test } => {}). Instead, received "context"."`;
6262
6363
exports[`should fail test-timeout.test.ts > test-timeout.test.ts 1`] = `
6464
"Error: Test timed out in 200ms.

0 commit comments

Comments
 (0)