我试图侦察被另一个函数调用的函数,这两个函数都驻留在外部文件中并导入。
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已经调用了它?
答案 0 :(得分:3)
只能监视方法。如果funcB
在同一模块中直接调用funcB()
,则无法监视funcA
。
为了对导出的函数进行监视或模拟,funcB
和funcB
应该驻留在不同的模块中。
这允许监视转换 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();
});
});