javascript - 开玩笑 - 使用 spyOn 函数时,确保不调用被监视的函数
问题描述
来自 Jest 笔记:注意:默认情况下, jest.spyOn 也调用 spie 方法。
在我的 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
互联网上的例子很少,但我不能阻止开玩笑调用原始offsetPopoverPosition()
方法。
有任何想法吗?
我正在交叉链接到 Jest github 问题,该问题由于某种原因已关闭而未解决。
解决方案
根据我的经验,问题是您正在重置原始模拟的意图。当您创建一个间谍时,它有自己的实现,通过用 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
使用的任何消息- 使用简短的问题内容,如果它阅读茶叶并且与您的单元测试设计无关,请忽略我给出的测试方法建议(s)
推荐阅读
- visual-studio - 如何将 unfloding 地图库安装到 VS 代码
- excel - 勾选时获取复选框的单元格地址
- python - 在构建 Kivy 应用程序“未安装 sdkmanager”时
- asp.net-mvc - MVC 验证复选框
- aws-lambda - 部署为 Docker 映像时如何运行多个 lambda 函数?
- jquery - 另一个范围内的 AlpineJS select2 组件引发错误
- matlab - 我可以在 MATLAB 中并行运行两个独立的 while 循环吗?
- javascript - iframe 中的 gtag 子域
- python - 我正在运行下面的代码。但我无法运行 Sentiment_score (df) 代码
- forms - Flutter - 如何创建此注册表单?