gpt4 book ai didi

javascript - 开 Jest - 使用 spyOn 函数时确保不调用被监视的函数

转载 作者:太空狗 更新时间:2023-10-29 17:40:02 26 4
gpt4 key购买 nike

来自 Jest 笔记:注意:默认情况下,jest.spyOn 也会调用 spied 方法。

在我的 Angular 组件中。

ngAfterViewInit(): void {
this.offsetPopoverPosition();
}

在我的规范中:

it('ngAfterViewInit() method should call offsetPopoverPosition() method', () => {
const mockListener = jest.spyOn(cmp, 'offsetPopoverPosition');
const spy = mockListener.mockImplementation(() => {
console.log('in the mock');
});

cmp.ngAfterViewInit();
expect(spy).toHaveBeenCalled();
});

简单。然而,原始功能仍在被调用。我检查了 Jest 23.x 文档: https://jestjs.io/docs/en/23.x/jest-object#jestspyonobject-methodname https://jestjs.io/docs/en/23.x/mock-function-api#mockfnmockimplementationfn

互联网上的例子很少,但我无法阻止 jest 调用原始的 offsetPopoverPosition() 方法。

有什么想法吗?

我正在交叉链接到 Jest github 问题,该问题由于某种原因关闭而未解决。

Jest spyOn() calls the actual function instead of the mocked

最佳答案

根据我的经验,问题在于您正在重置原始模拟的意图。当你创建一个 spy 时,它有自己的实现,通过用 mockImplementation 覆盖它,我经历过你描述的场景 - 相反,试试这个:

cmp.offsetPopoverPosition = jest.fn().mockImplementation(() => {
console.log('in the mock');
});
const mockListener = jest.spyOn(cmp, 'offsetPopoverPosition');
// ... do work
expect(mockListener).toHaveBeenCalled[Times,With]()

这还假设 cmp 是组件的一个实例,而不仅仅是它的定义引用

编辑:请注意,在您正在测试的组件内部模拟消息函数是一种错误的单元测试方法。不要测试与 sameComponent.method 的通信 - 测试链接方法使用的任何消息传递在被测组件之外 - 对于简短的问题内容,​​请忽略测试方法建议我已经给出了它是否阅读茶叶并且与您的单元测试设计无关

关于javascript - 开 Jest - 使用 spyOn 函数时确保不调用被监视的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com