ecmascript-6 jestjs

ecmascript 6 - Espiando una función importada que llama a otra función en Jest



ecmascript-6 jestjs (2)

El problema que usted describe está referenciado en un problema de broma .

Una posible solución a su problema (si desea mantener las funciones dentro del mismo archivo) es usar CommonJS, considere el siguiente ejemplo:

fns.js

exports.funcA = () => { exports.funcB(); }; exports.funcB = () => {};

fns.spec.js

const fns = require("./fns"); describe("funcA", () => { it("calls funcB", () => { fns.funcB = jest.fn(); fns.funcA(); expect(fns.funcB).toBeCalled(); }); });

Estoy tratando de espiar una función que es llamada por otra función, ambas residen en un archivo externo e importadas.

Funcs.spec.js:

import * as Funcs from ''./Funcs'' describe(''funcA'', () => { it(''calls funcB'', () => { jest.spyOn(Funcs, ''funcB'') Funcs.funcA() expect(Funcs.funcB).toHaveBeenCalled() } }

Funcs.js:

export const funcA = () => { funcB() } export const funcB = () => {}

Por alguna razón, el espía no se respeta en el alcance de Funcs.js. ¿Qué puedo hacer para espiar a funcB, así que sé que funcA lo ha llamado?


Sólo se pueden espiar los métodos. No hay forma de espiar a funcB si se llama directamente como funcB() dentro del mismo módulo.

Para que la función exportada sea espiada o funcA , funcA y funcB deben residir en diferentes módulos.

Esto permite espiar la funcB en el módulo ES transpilado (el objeto del módulo es de solo lectura en ESM nativo):

import { funcB } from ''./b''; export const funcA = () => { funcB() }

Debido a que las importaciones de módulos son representaciones de módulos, esto se transpila a:

var _b = require(''./b''); var funcA = exports.funcA = function funcA() { (0, _b.funcB)(); };

Cuando el método funcB está vinculado al objeto de módulo _b , es posible espiarlo.