lib: refactor lazy loading of undici for fetch method
Object.defineProperty is updated to lazily load the undici dependency for the fetch method. This change allows for simpler and more reliable mocking of the fetch method for testing purposes, resolving issues encountered with premature method invocation during testing. Fixes: https://github.com/nodejs/node/issues/52015 PR-URL: https://github.com/nodejs/node/pull/52275 Reviewed-By: Moshe Atlow <moshe@atlow.co.il> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Chemi Atlow <chemi@atlow.co.il> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This commit is contained in:
parent
1091efc2ab
commit
2cd3073e0f
@ -57,32 +57,21 @@ defineReplaceableLazyAttribute(globalThis, 'perf_hooks', ['performance']);
|
||||
const { installObjectURLMethods } = require('internal/url');
|
||||
installObjectURLMethods();
|
||||
|
||||
{
|
||||
// https://fetch.spec.whatwg.org/#fetch-method
|
||||
function set(value) {
|
||||
ObjectDefineProperty(globalThis, 'fetch', {
|
||||
__proto__: null,
|
||||
writable: true,
|
||||
value,
|
||||
});
|
||||
}
|
||||
ObjectDefineProperty(globalThis, 'fetch', {
|
||||
__proto__: null,
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
set,
|
||||
get() {
|
||||
function fetch(input, init = undefined) {
|
||||
// Loading undici alone lead to promises which breaks lots of tests so we
|
||||
// have to load it really lazily for now.
|
||||
const { fetch: impl } = require('internal/deps/undici/undici');
|
||||
return impl(input, init);
|
||||
}
|
||||
set(fetch);
|
||||
return fetch;
|
||||
},
|
||||
});
|
||||
}
|
||||
let fetchImpl;
|
||||
// https://fetch.spec.whatwg.org/#fetch-method
|
||||
ObjectDefineProperty(globalThis, 'fetch', {
|
||||
__proto__: null,
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
writable: true,
|
||||
value: function value(input, init = undefined) {
|
||||
if (!fetchImpl) { // Implement lazy loading of undici module for fetch function
|
||||
const undiciModule = require('internal/deps/undici/undici');
|
||||
fetchImpl = undiciModule.fetch;
|
||||
}
|
||||
return fetchImpl(input, init);
|
||||
},
|
||||
});
|
||||
|
||||
// https://xhr.spec.whatwg.org/#interface-formdata
|
||||
// https://fetch.spec.whatwg.org/#headers-class
|
||||
|
20
test/parallel/test-fetch-mock.js
Normal file
20
test/parallel/test-fetch-mock.js
Normal file
@ -0,0 +1,20 @@
|
||||
'use strict';
|
||||
require('../common');
|
||||
const { mock, test } = require('node:test');
|
||||
const assert = require('node:assert');
|
||||
|
||||
test('should correctly stub globalThis.fetch', async () => {
|
||||
const customFetch = async (url) => {
|
||||
return {
|
||||
text: async () => 'foo',
|
||||
};
|
||||
};
|
||||
|
||||
mock.method(globalThis, 'fetch', customFetch);
|
||||
|
||||
const response = await globalThis.fetch('some-url');
|
||||
const text = await response.text();
|
||||
|
||||
assert.strictEqual(text, 'foo');
|
||||
mock.restoreAll();
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user