Estoy tratando de simular temporalmente la búsqueda de nodos en un módulo ESM mientras sigo volviendo a entrenar la implementación original para poder acceder al valor de un punto final real. Sin embargo, este error dice "Debe usar la importación para cargar el Módulo ES". Reconozco que la compatibilidad con jest para ESM aún está pendiente. ¿Hay alguna forma de tener este comportamiento en una combinación de Node, ES6 y Jest actuales?
trabajador.ts (dependencia):
export default async () => { const response = await fetch("http://example2.org"); return await response.json() }principal.prueba.ts:
import { jest } from "@jest/globals"; jest.mock("node-fetch", () => { return Promise.resolve({ json: () => Promise.resolve({ myItem: "abc" }), }) }) import doWork from './worker.js'; import mockedFetch from 'node-fetch'; const originalFetch = jest.requireActual('node-fetch') as any; test("Ensure mock", async () => { const result = await doWork(); expect(result.myItem).toStrictEqual("abc"); expect(mockedFetch).toBeCalledTimes(1); const response = await originalFetch("http://www.example.org"); expect(response.status).toBe(200); const result2 = await doWork(); expect(result2.myItem).toStrictEqual("abc"); expect(mockedFetch).toBeCalledTimes(2); });Primero, Jest no admite jest.mock en el módulo ESM para pruebas
Tenga en cuenta que actualmente no admitimos jest.mock de manera limpia en ESM, pero eso es algo para lo que tenemos la intención de agregar soporte adecuado en el futuro. Siga este problema para obtener actualizaciones.
Esto es razonable porque import tiene una semántica diferente a require . Todas las importaciones se elevan y se evaluarán en la carga del módulo antes que cualquier código de módulo .
Entonces, en su caso, debido a que está usando jest.mock , asumo que su código de prueba se transforma . En este caso, si desea utilizar un paquete que no sea "CommonJS", también debe transformarlo. Puede cambiar transformIgnorePatterns en jest config a [] . Significa que todos los paquetes de node_modules se transformarán. Si es demasiado agresivo, puede elegir módulos específicos que ignoren "transformIgnorePatterns": [ "node_modules/(?!(node-fetch))" ] pero no se olvide de las dependencias transitivas. ;)
"transformIgnorePatterns": [] jest.mock("node-fetch", () => { return { __esModule: true, default: jest.fn(() => Promise.resolve({ json: () => Promise.resolve({ myItem: "abc" }), }) ), }; });si tienes un error
La fábrica de módulos de jest.mock() no puede hacer referencia a ninguna variable fuera del alcance
simplemente elimine jest de la importación y utilícelo como variable global o impórtelo dentro de la función de fábrica del módulo https://github.com/facebook/jest/issues/2567
const originalFetch = jest.requireActual('node-fetch') a const originalFetch = jest.requireActual('node-fetch').default;