javascript / expert
Snippet
Dynamic Object Mocking with Property Descriptors for Next.js Headers Unit Testing
This technique leverages low-level JavaScript property descriptors (Object.getOwnPropertyDescriptor and Object.defineProperty) to safely isolate and mock the global Headers constructor used in Next.js server runtime environments during unit tests. It returns a cleanup teardown function that restores the original global state.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
export function mockNextHeaders(headerMap) {const originalDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'Headers');const MockedHeaders = class extends Headers {constructor() {super();Object.entries(headerMap).forEach(([key, val]) => this.set(key, val));}};Object.defineProperty(globalThis, 'Headers', {value: MockedHeaders,configurable: true,writable: true});return () => {if (originalDescriptor) {Object.defineProperty(globalThis, 'Headers', originalDescriptor);} else {delete globalThis.Headers;}};}
nextjs
Breakdown
1
const originalDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'Headers');
Captures the exact property descriptor metadata of the global Headers object prior to modification.
2
Object.defineProperty(globalThis, 'Headers', { value: MockedHeaders, configurable: true, writable: true });
Overrides the global scope with the custom MockedHeaders implementation using precise configuration flags.
3
return () => { ... };
Returns a teardown function that restores the original global property descriptor to prevent test pollution.