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 调用了它?
只有方法可以被监视。funcB如果像funcB()在同一模块中那样直接调用它,则无法进行监视。
为了监视或模拟导出的函数,funcA以及funcB应该驻留在不同的模块中。
这允许窥探funcB在transpiled 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模块的对象,因此有可能窥探它。
您描述的问题是在一个玩笑问题上引用的。
解决您的问题的一个可能的解决方案(如果您想将函数保留在同一文件中)是使用 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)
| 归档时间: |
|
| 查看次数: |
10495 次 |
| 最近记录: |