监视导入的函数,该函数调用Jest中的另一个函数

时间:2018-06-14 09:45:17

标签: ecmascript-6 jestjs

我试图侦察被另一个函数调用的函数,这两个函数都驻留在外部文件中并导入。

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 = () => {}

由于某些原因,间谍在Funcs.js的范围内不受尊重。我可以做什么来监视funcB所以我知道funcA已经调用了它?

2 个答案:

答案 0 :(得分:3)

只能监视方法。如果funcB在同一模块中直接调用funcB(),则无法监视funcA

为了对导出的函数进行监视或模拟,funcBfuncB应该驻留在不同的模块中。

这允许监视转换 ES模块中的import { funcB } from './b'; export const funcA = () => { funcB() } (模块对象在本机ESM中是只读的):

var _b = require('./b');

var funcA = exports.funcA = function funcA() {
    (0, _b.funcB)();
};

由于模块导入是模块的表示,因此将其转换为:

funcB

_b方法绑定到-bindAddress 0.0.0.0 模块对象,因此可以监视它。

答案 1 :(得分:1)

您描述的问题在jest issue上引用。

问题的可能解决方案(如果要将函数保留在同一文件中)是使用CommonJS,请考虑以下示例:

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();
  });
});