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

Dea*_*mes 5 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

Funcs.js:

export const funcA = () => {
    funcB()
}
export const funcB = () => {}
Run Code Online (Sandbox Code Playgroud)

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

Est*_*ask 7

只有方法可以被监视。funcB如果像funcB()在同一模块中那样直接调用它,则无法进行监视。

为了监视或模拟导出的函数,funcA以及funcB应该驻留在不同的模块中。

这允许窥探funcBtranspiled ES模块(模块对象是只读的在天然ESM):

import { funcB } from './b';

export const funcA = () => {
    funcB()
}
Run Code Online (Sandbox Code Playgroud)

由于模块导入是模块的表示,这被转换为:

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

var funcA = exports.funcA = function funcA() {
    (0, _b.funcB)();
};
Run Code Online (Sandbox Code Playgroud)

funcB方法是依赖于_b模块的对象,因此有可能窥探它。


a--*_*--m 5

您描述的问题是在一个玩笑问题上引用的。

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

fns.js

exports.funcA = () => {
  exports.funcB();
};
exports.funcB = () => {};
Run Code Online (Sandbox Code Playgroud)

fns.spec.js

const fns = require("./fns");

describe("funcA", () => {
  it("calls funcB", () => {
    fns.funcB = jest.fn();
    fns.funcA();
    expect(fns.funcB).toBeCalled();
  });
});
Run Code Online (Sandbox Code Playgroud)