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.