- Notifications
You must be signed in to change notification settings - Fork 2.8k
Open
Description
Description
I have some code similar to the MDN example https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static#using_abortsignal.any that I'm trying to test with Jest and jsdom. Since jsdom doesn't offer its own fetch, I'm using this project to polyfill it.
However when a request is aborted due to AbortSignal.timeout(...), unlike browsers (Firefox) and Node.js (v22), it gives me an AbortError instead of TimeoutError.
Environment
- Node.js v22.12.0
- whatwg-fetch v3.6.20
- Jest v29.7.0
- jsdom v26.0.0
- ts-jest v29.1.1
Steps to reproduce
Test code:
it('whatwg-fetch', async () => { try { const signal = AbortSignal.timeout(20) signal.addEventListener('abort', (ev) => { const currentTarget = ev.currentTarget as typeof ev.currentTarget & { reason: DOMException } console.debug({ reason: currentTarget.reason.name }) }) await fetch('https://example.com', { signal }) } catch (e) { console.debug(e) expect((e as Error).name).toStrictEqual('TimeoutError') } })The test passes if I put
/** * @jest-environment node */...at the top of the file. Output:
console.debug <-- log in signal.addEventListener { reason: 'TimeoutError' } at AbortSignal.<anonymous> (src/shared/hooks/http/fetch.test.ts:38:15) console.debug <-- log in catch DOMException [TimeoutError]: The operation was aborted due to timeout at node:internal/deps/undici/undici:13484:13 at src/shared/hooks/http/fetch.test.ts:42:13 at Generator.throw (<anonymous>) PASS src/shared/hooks/http/fetch.test.ts (19.408 s) ✓ whatwg-fetch (501 ms) The test fails if I put
/** * @jest-environment jsdom */ import 'whatwg-fetch'...at the top of the file. Output:
console.debug <-- log in signal.addEventListener { reason: 'TimeoutError' } at AbortSignal.<anonymous> (src/shared/hooks/http/fetch.test.ts:38:15) console.debug <-- log in catch DOMException {} at src/shared/hooks/http/fetch.test.ts:42:13 at Generator.throw (<anonymous>) FAIL src/shared/hooks/http/fetch.test.ts (25.565 s) ✕ whatwg-fetch (412 ms) ● whatwg-fetch expect(received).toStrictEqual(expected) // deep equality Expected: "TimeoutError" Received: "AbortError" 41 | } catch (e) { 42 | console.debug(e) > 43 | expect((e as Error).name).toStrictEqual('TimeoutError') | ^ 44 | } 45 | }) 46 | at src/shared/hooks/http/fetch.test.ts:43:31 at Generator.throw (<anonymous>) at rejected (src/shared/hooks/http/fetch.test.ts:6:65) And in Firefox, one can navigate to https://example.com, then in Console:

Metadata
Metadata
Assignees
Labels
No labels