【发布时间】:2021-04-12 19:10:41
【问题描述】:
这是一个非常简单的场景,但我一直在努力寻找答案。
helpers.ts:
export function foo() {
bar();
}
export function bar() {
// do something
}
helpers.spec.ts:
import { foo, bar } from "./helpers";
describe("tests", () => {
it("example test", () => {
const barSpy = // how can i set this up?
foo();
expect(barSpy).toHaveBeenCalled();
});
});
我不能做const spy = jest.spyOn(baz, 'bar');,因为我没有模块/类来代替“baz”。它只是一个导出的函数。
编辑: Jest mock inner function 已被建议为重复,但不幸的是它对我的方案没有帮助。
该问题的解决方案:
-
移动到单独的模块:我无法为我的场景执行此操作。如果我在我的应用程序中测试每个函数,这将导致我创建 10 个不理想的新文件。 (澄清一下,我认为这个解决方案可以工作,但我不能在我的场景中使用它。我已经在这个测试文件中成功地模拟了一个单独的文件函数。)
-
将模块导入自身:
helpers.spec.ts:
import * as helpers from "./helpers";
describe("tests", () => {
it("example test", () => {
const barSpy = jest.spyOn(helpers, 'bar');
foo();
expect(barSpy).toHaveBeenCalled();
});
});
结果:
expect(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
【问题讨论】:
-
这能回答你的问题吗? Jest mock inner function
-
不幸的是,这并没有回答我的问题。在该场景中进行模拟在 spec.ts 文件中有效,但在原始文件中无效。原始文件仍然调用实际的 bar() 而不是模拟的 bar()
标签: javascript typescript unit-testing jestjs mocking