首页 > 解决方案 > 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();
  });
});

但事实证明,即使没有这个调整,这个测试也完全通过了,如果我在工厂函数中添加一个打印,我可以看到它只被调用一次。

有人可以向我解释工厂功能的确切行为是什么吗?

标签: javascriptunit-testingmockingjestjsnode-modules

解决方案


推荐阅读