javascript - jest.mock 模块工厂函数调用
问题描述
给定两个具有以下实现的简单模块:
bar.js
export function bar() {
return 1;
}
foo.js
import { bar } from './bar';
export function foo() {
return bar();
}
和测试foo.spec.js:
import { foo } from './foo';
import { bar } from './bar';
jest.mock('./bar', () => ({
bar: jest.fn(),
}));
describe('Testing blahblah', () => {
it('blahblah should call blah', () => {
foo();
expect(bar).toHaveBeenCalled();
});
});
您可能会注意到bar
使用模块工厂函数定义的模块模拟。
这个工厂函数是什么时候调用的,调用了多少次?
不知何故,我的印象是每次导入都会调用模块工厂函数,因此从 import inside 返回的模拟与从 import insidefoo.js
返回的模拟不同foo.spec.js
,这应该导致测试失败。
我通常会这样解决它:
mockBar = jest.fn();
import { foo } from './foo';
import { bar } from './bar';
jest.mock('./bar', () => ({
bar: mockBar,
}));
describe('Testing blahblah', () => {
it('blahblah should call blah', () => {
foo();
expect(bar).toHaveBeenCalled();
});
});
但事实证明,即使没有这个调整,这个测试也完全通过了,如果我在工厂函数中添加一个打印,我可以看到它只被调用一次。
有人可以向我解释工厂功能的确切行为是什么吗?
解决方案
推荐阅读
- python - 读取原始文本的第一行
- azure - Azure VPN 网关配置:Get-AzureRmVirtualNetworkGatewayConnection 返回 ResourceNotFound 错误
- amazon-web-services - AWS EC2:无法获取裸机实例 - 更新
- string - 在 if 循环中使用字符串长度作为参数
- c++ - 清理“QSettings”注册表项的最佳方法(Windows 上的 Qt 5)
- ios - SwiftUI:如何根据已经拖动的距离改变拖动速度?
- node.js - 将 Docker 用于节点应用程序时无法连接 Websocket
- html - 将三个表单按钮排成一行
- rust - 结构是否有一种安全的方法来存储将在结构外部修改的向量切片?
- visual-studio - VS 2017 - 更正后重新评估数据流警告