来自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-methodnamehttps://jestjs.io/docs/en/23.x/mock-function-api#mockfnmockimplementationfn
在互联网上有一些例子,但我不能阻止jest调用原始的offsetPopoverPosition()
方法。
有什么想法吗?
我交叉链接到Jest github问题,由于某种原因关闭而没有解决它。
Jest spyOn() calls the actual function instead of the mocked
2条答案
按热度按时间nfeuvbwi1#
根据我的经验,问题是你正在重置原始mock的意图。当你创建一个spy时,它有自己的实现,通过用mockImplementation覆盖它,我经历过你描述的场景-相反,试试这个:
字符串
这也假设
cmp
是组件的示例,而不仅仅是它的定义引用编辑:请注意,在您正在测试的组件内部模拟消息传递函数是单元测试的一种误导方法。而不是测试与
sameComponent.method
的通信-测试链接方法使用的任何消息传递在正在测试的组件外部-使用简短的问题内容,请忽略我给出的测试方法建议,如果它阅读茶叶,与你的单元测试设计无关。omqzjyyz2#
正如在GitHub问题中所建议的那样,唯一对我有效的方法是从同一个文件的导入中调用目标函数。在React中就是这样。
字符串
这是个奇怪的问题
然而,最佳解决方案似乎只是通过测试其他项目来避免这种情况(参见other answer)。