Skip to content

Commit b354bc1

Browse files
authoredMay 17, 2023
fix(browser): throw an error if test failed to load (#3390)
1 parent 2cb1a15 commit b354bc1

File tree

4 files changed

+32
-4
lines changed

4 files changed

+32
-4
lines changed
 

‎packages/vitest/src/node/browser/playwright.ts

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Page } from 'playwright'
22
import type { BrowserProvider, BrowserProviderOptions } from '../../types/browser'
33
import { ensurePackageInstalled } from '../pkg'
44
import type { WorkspaceProject } from '../workspace'
5+
import type { Awaitable } from '../../types'
56

67
export const playwrightBrowsers = ['firefox', 'webkit', 'chromium'] as const
78
export type PlaywrightBrowser = typeof playwrightBrowsers[number]
@@ -49,6 +50,13 @@ export class PlaywrightBrowserProvider implements BrowserProvider {
4950
return this.cachedBrowser
5051
}
5152

53+
catchError(cb: (error: Error) => Awaitable<void>) {
54+
this.cachedBrowser?.on('pageerror', cb)
55+
return () => {
56+
this.cachedBrowser?.off('pageerror', cb)
57+
}
58+
}
59+
5260
async openPage(url: string) {
5361
const browserInstance = await this.openBrowser()
5462
await browserInstance.goto(url)

‎packages/vitest/src/node/browser/webdriver.ts

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Browser } from 'webdriverio'
2+
import type { Awaitable } from '@vitest/utils'
23
import type { BrowserProvider, BrowserProviderOptions } from '../../types/browser'
34
import { ensurePackageInstalled } from '../pkg'
45
import type { WorkspaceProject } from '../workspace'
@@ -70,6 +71,11 @@ export class WebdriverBrowserProvider implements BrowserProvider {
7071
await browserInstance.url(url)
7172
}
7273

74+
// TODO
75+
catchError(_cb: (error: Error) => Awaitable<void>) {
76+
return () => {}
77+
}
78+
7379
async close() {
7480
await Promise.all([
7581
this.stopSafari(),

‎packages/vitest/src/node/pools/browser.ts

+17-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,23 @@ import type { BrowserProvider } from '../../types/browser'
88
export function createBrowserPool(ctx: Vitest): ProcessPool {
99
const providers = new Set<BrowserProvider>()
1010

11-
const waitForTest = (id: string) => {
11+
const waitForTest = async (provider: BrowserProvider, id: string) => {
1212
const defer = createDefer()
1313
ctx.state.browserTestPromises.set(id, defer)
14-
return defer
14+
const off = provider.catchError((error) => {
15+
if (id !== 'no-isolate') {
16+
Object.defineProperty(error, 'VITEST_TEST_PATH', {
17+
value: id,
18+
})
19+
}
20+
defer.reject(error)
21+
})
22+
try {
23+
return await defer
24+
}
25+
finally {
26+
off()
27+
}
1528
}
1629

1730
const runTests = async (project: WorkspaceProject, files: string[]) => {
@@ -40,15 +53,15 @@ export function createBrowserPool(ctx: Vitest): ProcessPool {
4053
url.searchParams.append('path', path)
4154
url.searchParams.set('id', path)
4255
await provider.openPage(url.toString())
43-
await waitForTest(path)
56+
await waitForTest(provider, path)
4457
}
4558
}
4659
else {
4760
const url = new URL('/', origin)
4861
url.searchParams.set('id', 'no-isolate')
4962
paths.forEach(path => url.searchParams.append('path', path))
5063
await provider.openPage(url.toString())
51-
await waitForTest('no-isolate')
64+
await waitForTest(provider, 'no-isolate')
5265
}
5366
}
5467

‎packages/vitest/src/types/browser.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface BrowserProvider {
1111
getSupportedBrowsers(): readonly string[]
1212
initialize(ctx: WorkspaceProject, options: BrowserProviderOptions): Awaitable<void>
1313
openPage(url: string): Awaitable<void>
14+
catchError(cb: (error: Error) => Awaitable<void>): () => Awaitable<void>
1415
close(): Awaitable<void>
1516
}
1617

0 commit comments

Comments
 (0)
Please sign in to comment.