El uso de simulacros de módulos en Jest se ha hecho desde el principio de los tiempos, sin embargo, a medida que avanzamos en el mundo de mjs, es imposible interceptar llamadas para require en tiempo de ejecución para habilitar este patrón.
jest.mock('./filename')Si bien generalmente hago todo lo posible para parametrizar mis dependencias, hay algunos casos en los que no es posible (como las dependencias de terceros) o es inconveniente y necesito simular explícitamente una o varias propiedades en un módulo.
He intentado varias formas de reasignar una propiedad:
// foo.mjs export function foo() { console.log('foo') }Reasignación simple: falla
import { foo } from './foo.mjs' import * as fooModule from './foo.mjs' fooModule.foo = function() { console.log('bar') } console.log(foo())Object.defineProperty - falla
import { foo } from './foo.mjs' import * as fooModule from './foo.mjs' Object.defineProperty(fooModule, 'foo', { value: function() { console.log('bar') }}) console.log(foo())Object.assign - falla
import { foo } from './foo.mjs' import * as fooModule from './foo.mjs' Object.assign(fooModule, { foo: function() { console.log('bar') } }) console.log(foo())Todos estos intentos fallan con
TypeError: Cannot assign to read only property 'foo' of object '[object Module]'En el nuevo Nodo con módulos, ¿hay alguna forma esperada de parchear módulos o partes de un módulo de modo que todas las importaciones posteriores de ese módulo reciban ese parche?