mirror of
https://github.com/nodejs/node.git
synced 2026-10-14 10:26:26 -04:00
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:
1 parent
f6145aa2ca
commit
fdcde845ee
2 files changed
+35
-26
No files matched your search
@@ -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
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
Reference in new issue
Block a user